Commit | Line | Data |
---|---|---|
1536a968 KM |
1 | /* |
2 | * Renesas R-Car | |
3 | * | |
4 | * Copyright (C) 2013 Renesas Solutions Corp. | |
5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License version 2 as | |
9 | * published by the Free Software Foundation. | |
10 | */ | |
11 | #ifndef RSND_H | |
12 | #define RSND_H | |
13 | ||
14 | #include <linux/clk.h> | |
15 | #include <linux/device.h> | |
0a4d94c0 | 16 | #include <linux/dma-mapping.h> |
1536a968 KM |
17 | #include <linux/io.h> |
18 | #include <linux/list.h> | |
19 | #include <linux/module.h> | |
90e8e50f | 20 | #include <linux/of_device.h> |
11d0f8ed | 21 | #include <linux/of_graph.h> |
90e8e50f | 22 | #include <linux/of_irq.h> |
0a4d94c0 KM |
23 | #include <linux/sh_dma.h> |
24 | #include <linux/workqueue.h> | |
1536a968 KM |
25 | #include <sound/soc.h> |
26 | #include <sound/pcm_params.h> | |
27 | ||
2ea2cc86 KM |
28 | #define RSND_GEN1_SRU 0 |
29 | #define RSND_GEN1_ADG 1 | |
30 | #define RSND_GEN1_SSI 2 | |
31 | ||
32 | #define RSND_GEN2_SCU 0 | |
33 | #define RSND_GEN2_ADG 1 | |
34 | #define RSND_GEN2_SSIU 2 | |
35 | #define RSND_GEN2_SSI 3 | |
36 | ||
37 | #define RSND_BASE_MAX 4 | |
dcc448e6 | 38 | |
1536a968 KM |
39 | /* |
40 | * pseudo register | |
41 | * | |
42 | * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. | |
43 | * This driver uses pseudo register in order to hide it. | |
44 | * see gen1/gen2 for detail | |
45 | */ | |
3337744a | 46 | enum rsnd_reg { |
bb7927c7 | 47 | /* SCU (MIX/CTU/DVC) */ |
bf4e8d7c KM |
48 | RSND_REG_SRC_I_BUSIF_MODE, |
49 | RSND_REG_SRC_O_BUSIF_MODE, | |
ef749400 KM |
50 | RSND_REG_SRC_ROUTE_MODE0, |
51 | RSND_REG_SRC_SWRSR, | |
52 | RSND_REG_SRC_SRCIR, | |
690ef81e | 53 | RSND_REG_SRC_ADINR, |
ef749400 KM |
54 | RSND_REG_SRC_IFSCR, |
55 | RSND_REG_SRC_IFSVR, | |
56 | RSND_REG_SRC_SRCCR, | |
f0b20e71 KM |
57 | RSND_REG_SRC_CTRL, |
58 | RSND_REG_SRC_BSDSR, | |
59 | RSND_REG_SRC_BSISR, | |
60 | RSND_REG_SRC_INT_ENABLE0, | |
61 | RSND_REG_SRC_BUSIF_DALIGN, | |
62 | RSND_REG_SRCIN_TIMSEL0, | |
63 | RSND_REG_SRCIN_TIMSEL1, | |
64 | RSND_REG_SRCIN_TIMSEL2, | |
65 | RSND_REG_SRCIN_TIMSEL3, | |
66 | RSND_REG_SRCIN_TIMSEL4, | |
67 | RSND_REG_SRCOUT_TIMSEL0, | |
68 | RSND_REG_SRCOUT_TIMSEL1, | |
69 | RSND_REG_SRCOUT_TIMSEL2, | |
70 | RSND_REG_SRCOUT_TIMSEL3, | |
71 | RSND_REG_SRCOUT_TIMSEL4, | |
cfcefe01 | 72 | RSND_REG_SCU_SYS_STATUS0, |
f0b20e71 | 73 | RSND_REG_SCU_SYS_STATUS1, |
cfcefe01 | 74 | RSND_REG_SCU_SYS_INT_EN0, |
f0b20e71 KM |
75 | RSND_REG_SCU_SYS_INT_EN1, |
76 | RSND_REG_CMD_CTRL, | |
90431eb4 | 77 | RSND_REG_CMD_BUSIF_MODE, |
f0b20e71 | 78 | RSND_REG_CMD_BUSIF_DALIGN, |
bff58ea4 | 79 | RSND_REG_CMD_ROUTE_SLCT, |
f0b20e71 | 80 | RSND_REG_CMDOUT_TIMSEL, |
bd9a603f | 81 | RSND_REG_CTU_SWRSR, |
9269e3c3 KM |
82 | RSND_REG_CTU_CTUIR, |
83 | RSND_REG_CTU_ADINR, | |
dc037afd KM |
84 | RSND_REG_CTU_CPMDR, |
85 | RSND_REG_CTU_SCMDR, | |
86 | RSND_REG_CTU_SV00R, | |
87 | RSND_REG_CTU_SV01R, | |
88 | RSND_REG_CTU_SV02R, | |
89 | RSND_REG_CTU_SV03R, | |
90 | RSND_REG_CTU_SV04R, | |
91 | RSND_REG_CTU_SV05R, | |
92 | RSND_REG_CTU_SV06R, | |
93 | RSND_REG_CTU_SV07R, | |
94 | RSND_REG_CTU_SV10R, | |
95 | RSND_REG_CTU_SV11R, | |
96 | RSND_REG_CTU_SV12R, | |
97 | RSND_REG_CTU_SV13R, | |
98 | RSND_REG_CTU_SV14R, | |
99 | RSND_REG_CTU_SV15R, | |
100 | RSND_REG_CTU_SV16R, | |
101 | RSND_REG_CTU_SV17R, | |
102 | RSND_REG_CTU_SV20R, | |
103 | RSND_REG_CTU_SV21R, | |
104 | RSND_REG_CTU_SV22R, | |
105 | RSND_REG_CTU_SV23R, | |
106 | RSND_REG_CTU_SV24R, | |
107 | RSND_REG_CTU_SV25R, | |
108 | RSND_REG_CTU_SV26R, | |
109 | RSND_REG_CTU_SV27R, | |
110 | RSND_REG_CTU_SV30R, | |
111 | RSND_REG_CTU_SV31R, | |
112 | RSND_REG_CTU_SV32R, | |
113 | RSND_REG_CTU_SV33R, | |
114 | RSND_REG_CTU_SV34R, | |
115 | RSND_REG_CTU_SV35R, | |
116 | RSND_REG_CTU_SV36R, | |
117 | RSND_REG_CTU_SV37R, | |
70fb1052 KM |
118 | RSND_REG_MIX_SWRSR, |
119 | RSND_REG_MIX_MIXIR, | |
120 | RSND_REG_MIX_ADINR, | |
121 | RSND_REG_MIX_MIXMR, | |
122 | RSND_REG_MIX_MVPDR, | |
123 | RSND_REG_MIX_MDBAR, | |
124 | RSND_REG_MIX_MDBBR, | |
125 | RSND_REG_MIX_MDBCR, | |
126 | RSND_REG_MIX_MDBDR, | |
127 | RSND_REG_MIX_MDBER, | |
bff58ea4 KM |
128 | RSND_REG_DVC_SWRSR, |
129 | RSND_REG_DVC_DVUIR, | |
130 | RSND_REG_DVC_ADINR, | |
131 | RSND_REG_DVC_DVUCR, | |
132 | RSND_REG_DVC_ZCMCR, | |
133 | RSND_REG_DVC_VOL0R, | |
134 | RSND_REG_DVC_VOL1R, | |
42ab9a79 KM |
135 | RSND_REG_DVC_VOL2R, |
136 | RSND_REG_DVC_VOL3R, | |
137 | RSND_REG_DVC_VOL4R, | |
138 | RSND_REG_DVC_VOL5R, | |
139 | RSND_REG_DVC_VOL6R, | |
140 | RSND_REG_DVC_VOL7R, | |
bff58ea4 | 141 | RSND_REG_DVC_DVUER, |
f0b20e71 KM |
142 | RSND_REG_DVC_VRCTR, |
143 | RSND_REG_DVC_VRPDR, | |
144 | RSND_REG_DVC_VRDBR, | |
07539c1d | 145 | |
dfc9403b KM |
146 | /* ADG */ |
147 | RSND_REG_BRRA, | |
148 | RSND_REG_BRRB, | |
3e58690b | 149 | RSND_REG_BRGCKR, |
f0b20e71 | 150 | RSND_REG_DIV_EN, |
dfc9403b KM |
151 | RSND_REG_AUDIO_CLK_SEL0, |
152 | RSND_REG_AUDIO_CLK_SEL1, | |
f0b20e71 | 153 | RSND_REG_AUDIO_CLK_SEL2, |
dfc9403b | 154 | |
bb7927c7 KM |
155 | /* SSIU */ |
156 | RSND_REG_SSI_MODE, | |
157 | RSND_REG_SSI_MODE0, | |
158 | RSND_REG_SSI_MODE1, | |
159 | RSND_REG_SSI_MODE2, | |
160 | RSND_REG_SSI_CONTROL, | |
161 | RSND_REG_SSI_CTRL, | |
162 | RSND_REG_SSI_BUSIF_MODE, | |
163 | RSND_REG_SSI_BUSIF_ADINR, | |
164 | RSND_REG_SSI_BUSIF_DALIGN, | |
165 | RSND_REG_SSI_INT_ENABLE, | |
814efe3e KM |
166 | RSND_REG_SSI_SYS_STATUS0, |
167 | RSND_REG_SSI_SYS_STATUS1, | |
168 | RSND_REG_SSI_SYS_STATUS2, | |
169 | RSND_REG_SSI_SYS_STATUS3, | |
170 | RSND_REG_SSI_SYS_STATUS4, | |
171 | RSND_REG_SSI_SYS_STATUS5, | |
172 | RSND_REG_SSI_SYS_STATUS6, | |
173 | RSND_REG_SSI_SYS_STATUS7, | |
7fa72cca KM |
174 | RSND_REG_HDMI0_SEL, |
175 | RSND_REG_HDMI1_SEL, | |
bb7927c7 | 176 | |
ae5c3223 KM |
177 | /* SSI */ |
178 | RSND_REG_SSICR, | |
179 | RSND_REG_SSISR, | |
180 | RSND_REG_SSITDR, | |
181 | RSND_REG_SSIRDR, | |
182 | RSND_REG_SSIWSR, | |
183 | ||
3337744a KM |
184 | RSND_REG_MAX, |
185 | }; | |
186 | ||
1536a968 | 187 | struct rsnd_priv; |
cdaa3cdf | 188 | struct rsnd_mod; |
1536a968 KM |
189 | struct rsnd_dai; |
190 | struct rsnd_dai_stream; | |
191 | ||
3337744a KM |
192 | /* |
193 | * R-Car basic functions | |
194 | */ | |
195 | #define rsnd_mod_read(m, r) \ | |
196 | rsnd_read(rsnd_mod_to_priv(m), m, RSND_REG_##r) | |
197 | #define rsnd_mod_write(m, r, d) \ | |
198 | rsnd_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) | |
199 | #define rsnd_mod_bset(m, r, s, d) \ | |
200 | rsnd_bset(rsnd_mod_to_priv(m), m, RSND_REG_##r, s, d) | |
201 | ||
3337744a KM |
202 | u32 rsnd_read(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg); |
203 | void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod, | |
204 | enum rsnd_reg reg, u32 data); | |
7b47ab47 KM |
205 | void rsnd_force_write(struct rsnd_priv *priv, struct rsnd_mod *mod, |
206 | enum rsnd_reg reg, u32 data); | |
3337744a KM |
207 | void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg, |
208 | u32 mask, u32 data); | |
3023b384 | 209 | u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
4689032b | 210 | u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
90431eb4 | 211 | u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
3337744a | 212 | |
0a4d94c0 KM |
213 | /* |
214 | * R-Car DMA | |
215 | */ | |
355cb84f | 216 | int rsnd_dma_attach(struct rsnd_dai_stream *io, |
b99305d2 | 217 | struct rsnd_mod *mod, struct rsnd_mod **dma_mod); |
2ea6b074 | 218 | int rsnd_dma_probe(struct rsnd_priv *priv); |
72adc61f KM |
219 | struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, |
220 | struct rsnd_mod *mod, char *name); | |
0a4d94c0 | 221 | |
cdaa3cdf KM |
222 | /* |
223 | * R-Car sound mod | |
224 | */ | |
a126021d | 225 | enum rsnd_mod_type { |
940e9479 KM |
226 | RSND_MOD_AUDMAPP, |
227 | RSND_MOD_AUDMA, | |
228 | RSND_MOD_DVC, | |
70fb1052 | 229 | RSND_MOD_MIX, |
9269e3c3 | 230 | RSND_MOD_CTU, |
1b2ca0ad | 231 | RSND_MOD_CMD, |
8048b91f | 232 | RSND_MOD_SRC, |
b4c83b17 KM |
233 | RSND_MOD_SSIM3, /* SSI multi 3 */ |
234 | RSND_MOD_SSIM2, /* SSI multi 2 */ | |
235 | RSND_MOD_SSIM1, /* SSI multi 1 */ | |
236 | RSND_MOD_SSIP, /* SSI parent */ | |
a126021d | 237 | RSND_MOD_SSI, |
cdf310ce | 238 | RSND_MOD_SSIU, |
a126021d KM |
239 | RSND_MOD_MAX, |
240 | }; | |
cdaa3cdf KM |
241 | |
242 | struct rsnd_mod_ops { | |
243 | char *name; | |
9b99e9a7 KM |
244 | struct dma_chan* (*dma_req)(struct rsnd_dai_stream *io, |
245 | struct rsnd_mod *mod); | |
7681f6ac | 246 | int (*probe)(struct rsnd_mod *mod, |
2c0fac19 | 247 | struct rsnd_dai_stream *io, |
690602fc | 248 | struct rsnd_priv *priv); |
7681f6ac | 249 | int (*remove)(struct rsnd_mod *mod, |
2c0fac19 | 250 | struct rsnd_dai_stream *io, |
690602fc | 251 | struct rsnd_priv *priv); |
cdaa3cdf | 252 | int (*init)(struct rsnd_mod *mod, |
2c0fac19 | 253 | struct rsnd_dai_stream *io, |
690602fc | 254 | struct rsnd_priv *priv); |
cdaa3cdf | 255 | int (*quit)(struct rsnd_mod *mod, |
2c0fac19 | 256 | struct rsnd_dai_stream *io, |
690602fc | 257 | struct rsnd_priv *priv); |
cdaa3cdf | 258 | int (*start)(struct rsnd_mod *mod, |
2c0fac19 | 259 | struct rsnd_dai_stream *io, |
690602fc | 260 | struct rsnd_priv *priv); |
cdaa3cdf | 261 | int (*stop)(struct rsnd_mod *mod, |
2c0fac19 | 262 | struct rsnd_dai_stream *io, |
690602fc | 263 | struct rsnd_priv *priv); |
b5b442ab KM |
264 | int (*irq)(struct rsnd_mod *mod, |
265 | struct rsnd_dai_stream *io, | |
266 | struct rsnd_priv *priv, int enable); | |
bff58ea4 | 267 | int (*pcm_new)(struct rsnd_mod *mod, |
2c0fac19 | 268 | struct rsnd_dai_stream *io, |
bff58ea4 | 269 | struct snd_soc_pcm_runtime *rtd); |
3b7843ff | 270 | int (*hw_params)(struct rsnd_mod *mod, |
2c0fac19 | 271 | struct rsnd_dai_stream *io, |
3b7843ff KM |
272 | struct snd_pcm_substream *substream, |
273 | struct snd_pcm_hw_params *hw_params); | |
07b7acb5 KM |
274 | int (*pointer)(struct rsnd_mod *mod, |
275 | struct rsnd_dai_stream *io, | |
276 | snd_pcm_uframes_t *pointer); | |
97463e19 | 277 | int (*fallback)(struct rsnd_mod *mod, |
2c0fac19 | 278 | struct rsnd_dai_stream *io, |
690602fc | 279 | struct rsnd_priv *priv); |
10a9cca1 KM |
280 | int (*nolock_start)(struct rsnd_mod *mod, |
281 | struct rsnd_dai_stream *io, | |
282 | struct rsnd_priv *priv); | |
283 | int (*nolock_stop)(struct rsnd_mod *mod, | |
284 | struct rsnd_dai_stream *io, | |
285 | struct rsnd_priv *priv); | |
cdaa3cdf KM |
286 | }; |
287 | ||
4686a0ad | 288 | struct rsnd_dai_stream; |
cdaa3cdf KM |
289 | struct rsnd_mod { |
290 | int id; | |
a126021d | 291 | enum rsnd_mod_type type; |
cdaa3cdf | 292 | struct rsnd_mod_ops *ops; |
2099bc8e | 293 | struct rsnd_priv *priv; |
85642952 | 294 | struct clk *clk; |
5ba17b42 KM |
295 | u32 *(*get_status)(struct rsnd_dai_stream *io, |
296 | struct rsnd_mod *mod, | |
297 | enum rsnd_mod_type type); | |
298 | u32 status; | |
cdaa3cdf | 299 | }; |
417f9642 KM |
300 | /* |
301 | * status | |
302 | * | |
10a9cca1 | 303 | * 0xH0000CBA |
3b7843ff | 304 | * |
10a9cca1 | 305 | * A 0: nolock_start 1: nolock_stop |
5451ea44 KM |
306 | * B 0: init 1: quit |
307 | * C 0: start 1: stop | |
308 | * | |
309 | * H is always called (see __rsnd_mod_call) | |
ea96380b | 310 | * H 0: probe 1: remove |
5451ea44 KM |
311 | * H 0: pcm_new |
312 | * H 0: fallback | |
313 | * H 0: hw_params | |
07b7acb5 | 314 | * H 0: pointer |
417f9642 | 315 | */ |
10a9cca1 KM |
316 | #define __rsnd_mod_shift_nolock_start 0 |
317 | #define __rsnd_mod_shift_nolock_stop 0 | |
5451ea44 KM |
318 | #define __rsnd_mod_shift_init 4 |
319 | #define __rsnd_mod_shift_quit 4 | |
320 | #define __rsnd_mod_shift_start 8 | |
321 | #define __rsnd_mod_shift_stop 8 | |
0af5c01a KM |
322 | #define __rsnd_mod_shift_probe 28 /* always called */ |
323 | #define __rsnd_mod_shift_remove 28 /* always called */ | |
b5b442ab | 324 | #define __rsnd_mod_shift_irq 28 /* always called */ |
5451ea44 KM |
325 | #define __rsnd_mod_shift_pcm_new 28 /* always called */ |
326 | #define __rsnd_mod_shift_fallback 28 /* always called */ | |
327 | #define __rsnd_mod_shift_hw_params 28 /* always called */ | |
07b7acb5 | 328 | #define __rsnd_mod_shift_pointer 28 /* always called */ |
5451ea44 | 329 | |
0af5c01a KM |
330 | #define __rsnd_mod_add_probe 0 |
331 | #define __rsnd_mod_add_remove 0 | |
10a9cca1 KM |
332 | #define __rsnd_mod_add_nolock_start 1 |
333 | #define __rsnd_mod_add_nolock_stop -1 | |
5451ea44 KM |
334 | #define __rsnd_mod_add_init 1 |
335 | #define __rsnd_mod_add_quit -1 | |
336 | #define __rsnd_mod_add_start 1 | |
337 | #define __rsnd_mod_add_stop -1 | |
b5b442ab | 338 | #define __rsnd_mod_add_irq 0 |
5451ea44 KM |
339 | #define __rsnd_mod_add_pcm_new 0 |
340 | #define __rsnd_mod_add_fallback 0 | |
341 | #define __rsnd_mod_add_hw_params 0 | |
07b7acb5 | 342 | #define __rsnd_mod_add_pointer 0 |
417f9642 KM |
343 | |
344 | #define __rsnd_mod_call_probe 0 | |
0af5c01a | 345 | #define __rsnd_mod_call_remove 0 |
417f9642 KM |
346 | #define __rsnd_mod_call_init 0 |
347 | #define __rsnd_mod_call_quit 1 | |
348 | #define __rsnd_mod_call_start 0 | |
349 | #define __rsnd_mod_call_stop 1 | |
b5b442ab | 350 | #define __rsnd_mod_call_irq 0 |
417f9642 KM |
351 | #define __rsnd_mod_call_pcm_new 0 |
352 | #define __rsnd_mod_call_fallback 0 | |
3b7843ff | 353 | #define __rsnd_mod_call_hw_params 0 |
07b7acb5 | 354 | #define __rsnd_mod_call_pointer 0 |
10a9cca1 KM |
355 | #define __rsnd_mod_call_nolock_start 0 |
356 | #define __rsnd_mod_call_nolock_stop 1 | |
cdaa3cdf | 357 | |
9b6ea250 KM |
358 | #define rsnd_mod_to_priv(mod) ((mod)->priv) |
359 | #define rsnd_mod_name(mod) ((mod)->ops->name) | |
360 | #define rsnd_mod_id(mod) ((mod)->id) | |
c9929345 KM |
361 | #define rsnd_mod_power_on(mod) clk_enable((mod)->clk) |
362 | #define rsnd_mod_power_off(mod) clk_disable((mod)->clk) | |
b76e218a | 363 | #define rsnd_mod_get(ip) (&(ip)->mod) |
cdaa3cdf | 364 | |
2099bc8e KM |
365 | int rsnd_mod_init(struct rsnd_priv *priv, |
366 | struct rsnd_mod *mod, | |
5ba17b42 KM |
367 | struct rsnd_mod_ops *ops, |
368 | struct clk *clk, | |
369 | u32* (*get_status)(struct rsnd_dai_stream *io, | |
370 | struct rsnd_mod *mod, | |
371 | enum rsnd_mod_type type), | |
372 | enum rsnd_mod_type type, | |
373 | int id); | |
2f78dd7f | 374 | void rsnd_mod_quit(struct rsnd_mod *mod); |
9b99e9a7 KM |
375 | struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io, |
376 | struct rsnd_mod *mod); | |
f501b7a4 KM |
377 | void rsnd_mod_interrupt(struct rsnd_mod *mod, |
378 | void (*callback)(struct rsnd_mod *mod, | |
379 | struct rsnd_dai_stream *io)); | |
5ba17b42 KM |
380 | u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io, |
381 | struct rsnd_mod *mod, | |
382 | enum rsnd_mod_type type); | |
b3ca3fbe KM |
383 | struct rsnd_mod *rsnd_mod_next(int *iterator, |
384 | struct rsnd_dai_stream *io, | |
385 | enum rsnd_mod_type *array, | |
386 | int array_size); | |
387 | #define for_each_rsnd_mod(iterator, pos, io) \ | |
388 | for (iterator = 0; \ | |
826e83de | 389 | (pos = rsnd_mod_next(&iterator, io, NULL, 0)); iterator++) |
b3ca3fbe KM |
390 | #define for_each_rsnd_mod_arrays(iterator, pos, io, array, size) \ |
391 | for (iterator = 0; \ | |
826e83de | 392 | (pos = rsnd_mod_next(&iterator, io, array, size)); iterator++) |
b3ca3fbe KM |
393 | #define for_each_rsnd_mod_array(iterator, pos, io, array) \ |
394 | for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array)) | |
5ba17b42 | 395 | |
89b66174 KM |
396 | void rsnd_parse_connect_common(struct rsnd_dai *rdai, |
397 | struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id), | |
398 | struct device_node *node, | |
399 | struct device_node *playback, | |
400 | struct device_node *capture); | |
cdaa3cdf | 401 | |
b2fb31bb KM |
402 | #define rsnd_runtime_channel_original(io) \ |
403 | rsnd_runtime_channel_original_with_params(io, NULL) | |
404 | int rsnd_runtime_channel_original_with_params(struct rsnd_dai_stream *io, | |
405 | struct snd_pcm_hw_params *params); | |
406 | #define rsnd_runtime_channel_after_ctu(io) \ | |
407 | rsnd_runtime_channel_after_ctu_with_params(io, NULL) | |
408 | int rsnd_runtime_channel_after_ctu_with_params(struct rsnd_dai_stream *io, | |
409 | struct snd_pcm_hw_params *params); | |
410 | #define rsnd_runtime_channel_for_ssi(io) \ | |
411 | rsnd_runtime_channel_for_ssi_with_params(io, NULL) | |
412 | int rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io, | |
413 | struct snd_pcm_hw_params *params); | |
eed76bb8 KM |
414 | int rsnd_runtime_is_ssi_multi(struct rsnd_dai_stream *io); |
415 | int rsnd_runtime_is_ssi_tdm(struct rsnd_dai_stream *io); | |
416 | ||
be78cea1 KM |
417 | /* |
418 | * DT | |
419 | */ | |
420 | #define rsnd_parse_of_node(priv, node) \ | |
421 | of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node) | |
422 | #define RSND_NODE_DAI "rcar_sound,dai" | |
423 | #define RSND_NODE_SSI "rcar_sound,ssi" | |
424 | #define RSND_NODE_SRC "rcar_sound,src" | |
425 | #define RSND_NODE_CTU "rcar_sound,ctu" | |
426 | #define RSND_NODE_MIX "rcar_sound,mix" | |
427 | #define RSND_NODE_DVC "rcar_sound,dvc" | |
428 | ||
1536a968 KM |
429 | /* |
430 | * R-Car sound DAI | |
431 | */ | |
432 | #define RSND_DAI_NAME_SIZE 16 | |
433 | struct rsnd_dai_stream { | |
f8c3c309 | 434 | char name[RSND_DAI_NAME_SIZE]; |
1536a968 | 435 | struct snd_pcm_substream *substream; |
a126021d | 436 | struct rsnd_mod *mod[RSND_MOD_MAX]; |
54cb5562 | 437 | struct rsnd_dai *rdai; |
5ba17b42 | 438 | u32 parent_ssi_status; |
1536a968 | 439 | }; |
5cbbadd3 KM |
440 | #define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) |
441 | #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) | |
3ce2959d | 442 | #define rsnd_io_to_mod_ssiu(io) rsnd_io_to_mod((io), RSND_MOD_SSIU) |
e7d850dd | 443 | #define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP) |
5cbbadd3 | 444 | #define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) |
9269e3c3 | 445 | #define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) |
70fb1052 | 446 | #define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) |
5cbbadd3 | 447 | #define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) |
a504b1ee | 448 | #define rsnd_io_to_mod_cmd(io) rsnd_io_to_mod((io), RSND_MOD_CMD) |
54cb5562 | 449 | #define rsnd_io_to_rdai(io) ((io)->rdai) |
1b13d118 | 450 | #define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) |
985a4f6e | 451 | #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) |
9d0e202f KM |
452 | #define rsnd_io_to_runtime(io) ((io)->substream ? \ |
453 | (io)->substream->runtime : NULL) | |
d5bbe7de | 454 | int rsnd_io_is_working(struct rsnd_dai_stream *io); |
985a4f6e | 455 | |
1536a968 KM |
456 | struct rsnd_dai { |
457 | char name[RSND_DAI_NAME_SIZE]; | |
1536a968 KM |
458 | struct rsnd_dai_stream playback; |
459 | struct rsnd_dai_stream capture; | |
1b13d118 | 460 | struct rsnd_priv *priv; |
8cc03722 | 461 | struct snd_pcm_hw_constraint_list constraint; |
1536a968 | 462 | |
1ff9593d KM |
463 | int max_channels; /* 2ch - 16ch */ |
464 | int ssi_lane; /* 1lane - 4lane */ | |
8ec85e7f | 465 | |
a3737731 DC |
466 | unsigned int clk_master:1; |
467 | unsigned int bit_clk_inv:1; | |
468 | unsigned int frm_clk_inv:1; | |
469 | unsigned int sys_delay:1; | |
470 | unsigned int data_alignment:1; | |
1536a968 KM |
471 | }; |
472 | ||
ecba9e72 | 473 | #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) |
3ed6448c | 474 | #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master) |
1b13d118 | 475 | #define rsnd_rdai_to_priv(rdai) ((rdai)->priv) |
1536a968 | 476 | #define for_each_rsnd_dai(rdai, priv, i) \ |
00463c11 | 477 | for (i = 0; \ |
ecba9e72 | 478 | (i < rsnd_rdai_nr(priv)) && \ |
710d0889 | 479 | ((rdai) = rsnd_rdai_get(priv, i)); \ |
00463c11 | 480 | i++) |
1536a968 | 481 | |
710d0889 KM |
482 | struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id); |
483 | ||
1ff9593d KM |
484 | #define rsnd_rdai_channels_set(rdai, max_channels) \ |
485 | rsnd_rdai_channels_ctrl(rdai, max_channels) | |
486 | #define rsnd_rdai_channels_get(rdai) \ | |
487 | rsnd_rdai_channels_ctrl(rdai, 0) | |
488 | int rsnd_rdai_channels_ctrl(struct rsnd_dai *rdai, | |
489 | int max_channels); | |
490 | ||
491 | #define rsnd_rdai_ssi_lane_set(rdai, ssi_lane) \ | |
492 | rsnd_rdai_ssi_lane_ctrl(rdai, ssi_lane) | |
493 | #define rsnd_rdai_ssi_lane_get(rdai) \ | |
494 | rsnd_rdai_ssi_lane_ctrl(rdai, 0) | |
495 | int rsnd_rdai_ssi_lane_ctrl(struct rsnd_dai *rdai, | |
496 | int ssi_lane); | |
497 | ||
75defee0 | 498 | void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); |
27924f32 KM |
499 | int rsnd_dai_connect(struct rsnd_mod *mod, |
500 | struct rsnd_dai_stream *io, | |
501 | enum rsnd_mod_type type); | |
1536a968 | 502 | |
3337744a KM |
503 | /* |
504 | * R-Car Gen1/Gen2 | |
505 | */ | |
2ea6b074 | 506 | int rsnd_gen_probe(struct rsnd_priv *priv); |
3337744a KM |
507 | void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, |
508 | struct rsnd_mod *mod, | |
509 | enum rsnd_reg reg); | |
c5212b45 | 510 | phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); |
ad32d0c7 | 511 | |
dfc9403b KM |
512 | /* |
513 | * R-Car ADG | |
514 | */ | |
1dfdc650 | 515 | int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate); |
dfc9403b KM |
516 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod); |
517 | int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate); | |
2ea6b074 KM |
518 | int rsnd_adg_probe(struct rsnd_priv *priv); |
519 | void rsnd_adg_remove(struct rsnd_priv *priv); | |
0102eed5 | 520 | int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod, |
629509c5 | 521 | struct rsnd_dai_stream *io, |
0102eed5 KM |
522 | unsigned int in_rate, |
523 | unsigned int out_rate); | |
f708d944 | 524 | int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, |
bff58ea4 | 525 | struct rsnd_dai_stream *io); |
c2d31718 KM |
526 | #define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1) |
527 | #define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0) | |
528 | void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable); | |
dfc9403b | 529 | |
1536a968 KM |
530 | /* |
531 | * R-Car sound priv | |
532 | */ | |
533 | struct rsnd_priv { | |
534 | ||
9f464f8e | 535 | struct platform_device *pdev; |
1536a968 | 536 | spinlock_t lock; |
c51eb1c6 | 537 | unsigned long flags; |
2ea2cc86 KM |
538 | #define RSND_GEN_MASK (0xF << 0) |
539 | #define RSND_GEN1 (1 << 0) | |
540 | #define RSND_GEN2 (2 << 0) | |
1536a968 | 541 | |
3337744a KM |
542 | /* |
543 | * below value will be filled on rsnd_gen_probe() | |
544 | */ | |
545 | void *gen; | |
546 | ||
dfc9403b KM |
547 | /* |
548 | * below value will be filled on rsnd_adg_probe() | |
549 | */ | |
550 | void *adg; | |
551 | ||
288f392e KM |
552 | /* |
553 | * below value will be filled on rsnd_dma_probe() | |
554 | */ | |
555 | void *dma; | |
556 | ||
ae5c3223 KM |
557 | /* |
558 | * below value will be filled on rsnd_ssi_probe() | |
559 | */ | |
dd27d808 KM |
560 | void *ssi; |
561 | int ssi_nr; | |
ae5c3223 | 562 | |
c7f69ab5 KM |
563 | /* |
564 | * below value will be filled on rsnd_ssiu_probe() | |
565 | */ | |
566 | void *ssiu; | |
567 | int ssiu_nr; | |
568 | ||
78edead4 KM |
569 | /* |
570 | * below value will be filled on rsnd_src_probe() | |
571 | */ | |
572 | void *src; | |
573 | int src_nr; | |
574 | ||
9269e3c3 KM |
575 | /* |
576 | * below value will be filled on rsnd_ctu_probe() | |
577 | */ | |
578 | void *ctu; | |
579 | int ctu_nr; | |
580 | ||
70fb1052 KM |
581 | /* |
582 | * below value will be filled on rsnd_mix_probe() | |
583 | */ | |
584 | void *mix; | |
585 | int mix_nr; | |
586 | ||
bff58ea4 KM |
587 | /* |
588 | * below value will be filled on rsnd_dvc_probe() | |
589 | */ | |
590 | void *dvc; | |
591 | int dvc_nr; | |
592 | ||
1b2ca0ad KM |
593 | /* |
594 | * below value will be filled on rsnd_cmd_probe() | |
595 | */ | |
596 | void *cmd; | |
597 | int cmd_nr; | |
598 | ||
1536a968 KM |
599 | /* |
600 | * below value will be filled on rsnd_dai_probe() | |
601 | */ | |
602 | struct snd_soc_dai_driver *daidrv; | |
603 | struct rsnd_dai *rdai; | |
ecba9e72 | 604 | int rdai_nr; |
1536a968 KM |
605 | }; |
606 | ||
9f464f8e KM |
607 | #define rsnd_priv_to_pdev(priv) ((priv)->pdev) |
608 | #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) | |
1536a968 | 609 | |
348d592c KM |
610 | #define rsnd_is_gen1(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN1) |
611 | #define rsnd_is_gen2(priv) (((priv)->flags & RSND_GEN_MASK) == RSND_GEN2) | |
612 | ||
42991989 KM |
613 | #define rsnd_flags_has(p, f) ((p)->flags & (f)) |
614 | #define rsnd_flags_set(p, f) ((p)->flags |= (f)) | |
615 | #define rsnd_flags_del(p, f) ((p)->flags &= ~(f)) | |
616 | ||
170a2497 KM |
617 | /* |
618 | * rsnd_kctrl | |
619 | */ | |
620 | struct rsnd_kctrl_cfg { | |
621 | unsigned int max; | |
622 | unsigned int size; | |
623 | u32 *val; | |
624 | const char * const *texts; | |
f0b04d8b | 625 | int (*accept)(struct rsnd_dai_stream *io); |
b65a7ccc KM |
626 | void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
627 | struct rsnd_dai_stream *io; | |
d1f83d6e KM |
628 | struct snd_card *card; |
629 | struct snd_kcontrol *kctrl; | |
16d44989 | 630 | struct rsnd_mod *mod; |
170a2497 KM |
631 | }; |
632 | ||
d2240f0d | 633 | #define RSND_MAX_CHANNELS 8 |
170a2497 KM |
634 | struct rsnd_kctrl_cfg_m { |
635 | struct rsnd_kctrl_cfg cfg; | |
d2240f0d | 636 | u32 val[RSND_MAX_CHANNELS]; |
170a2497 KM |
637 | }; |
638 | ||
639 | struct rsnd_kctrl_cfg_s { | |
640 | struct rsnd_kctrl_cfg cfg; | |
641 | u32 val; | |
642 | }; | |
3a9fa27b KM |
643 | #define rsnd_kctrl_size(x) ((x).cfg.size) |
644 | #define rsnd_kctrl_max(x) ((x).cfg.max) | |
645 | #define rsnd_kctrl_valm(x, i) ((x).val[i]) /* = (x).cfg.val[i] */ | |
646 | #define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */ | |
170a2497 | 647 | |
f0b04d8b KM |
648 | int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io); |
649 | int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io); | |
32973dcf KM |
650 | struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg); |
651 | struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg); | |
652 | int rsnd_kctrl_new(struct rsnd_mod *mod, | |
653 | struct rsnd_dai_stream *io, | |
654 | struct snd_soc_pcm_runtime *rtd, | |
655 | const unsigned char *name, | |
f0b04d8b | 656 | int (*accept)(struct rsnd_dai_stream *io), |
32973dcf KM |
657 | void (*update)(struct rsnd_dai_stream *io, |
658 | struct rsnd_mod *mod), | |
659 | struct rsnd_kctrl_cfg *cfg, | |
660 | const char * const *texts, | |
661 | int size, | |
662 | u32 max); | |
663 | ||
f0b04d8b KM |
664 | #define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \ |
665 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \ | |
32973dcf KM |
666 | NULL, size, max) |
667 | ||
f0b04d8b KM |
668 | #define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max) \ |
669 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ | |
32973dcf KM |
670 | NULL, 1, max) |
671 | ||
f3c26ac6 | 672 | #define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts, size) \ |
f0b04d8b | 673 | rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \ |
f3c26ac6 KM |
674 | texts, 1, size) |
675 | ||
676 | extern const char * const volume_ramp_rate[]; | |
677 | #define VOLUME_RAMP_MAX_DVC (0x17 + 1) | |
3e3c9ee1 | 678 | #define VOLUME_RAMP_MAX_MIX (0x0a + 1) |
170a2497 | 679 | |
78edead4 KM |
680 | /* |
681 | * R-Car SSI | |
682 | */ | |
2ea6b074 KM |
683 | int rsnd_ssi_probe(struct rsnd_priv *priv); |
684 | void rsnd_ssi_remove(struct rsnd_priv *priv); | |
78edead4 | 685 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); |
78edead4 | 686 | int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); |
b415b4d3 | 687 | int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); |
4f5c634d | 688 | u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io); |
b415b4d3 | 689 | |
7fa72cca KM |
690 | #define RSND_SSI_HDMI_PORT0 0xf0 |
691 | #define RSND_SSI_HDMI_PORT1 0xf1 | |
692 | int rsnd_ssi_hdmi_port(struct rsnd_dai_stream *io); | |
693 | void rsnd_ssi_parse_hdmi_connection(struct rsnd_priv *priv, | |
694 | struct device_node *endpoint, | |
695 | int dai_i); | |
696 | ||
b415b4d3 KM |
697 | #define rsnd_ssi_is_pin_sharing(io) \ |
698 | __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) | |
699 | int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); | |
78edead4 | 700 | |
be78cea1 | 701 | #define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI) |
b4c83b17 KM |
702 | void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, |
703 | struct device_node *playback, | |
704 | struct device_node *capture); | |
947f4eb5 | 705 | unsigned int rsnd_ssi_clk_query(struct rsnd_priv *priv, |
ef4cf5d6 | 706 | int param1, int param2, int *idx); |
94e2710c | 707 | |
c7f69ab5 KM |
708 | /* |
709 | * R-Car SSIU | |
710 | */ | |
711 | int rsnd_ssiu_attach(struct rsnd_dai_stream *io, | |
712 | struct rsnd_mod *mod); | |
2ea6b074 KM |
713 | int rsnd_ssiu_probe(struct rsnd_priv *priv); |
714 | void rsnd_ssiu_remove(struct rsnd_priv *priv); | |
c7f69ab5 | 715 | |
07539c1d | 716 | /* |
ba9c949f | 717 | * R-Car SRC |
07539c1d | 718 | */ |
2ea6b074 KM |
719 | int rsnd_src_probe(struct rsnd_priv *priv); |
720 | void rsnd_src_remove(struct rsnd_priv *priv); | |
ba9c949f | 721 | struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); |
cbf1494f KM |
722 | |
723 | #define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1) | |
724 | #define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0) | |
725 | unsigned int rsnd_src_get_rate(struct rsnd_priv *priv, | |
726 | struct rsnd_dai_stream *io, | |
727 | int is_in); | |
728 | ||
be78cea1 | 729 | #define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC) |
89b66174 KM |
730 | #define rsnd_parse_connect_src(rdai, playback, capture) \ |
731 | rsnd_parse_connect_common(rdai, rsnd_src_mod_get, \ | |
732 | rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \ | |
733 | playback, capture) | |
ef749400 | 734 | |
9269e3c3 KM |
735 | /* |
736 | * R-Car CTU | |
737 | */ | |
2ea6b074 KM |
738 | int rsnd_ctu_probe(struct rsnd_priv *priv); |
739 | void rsnd_ctu_remove(struct rsnd_priv *priv); | |
8a3a2211 | 740 | int rsnd_ctu_converted_channel(struct rsnd_mod *mod); |
9269e3c3 | 741 | struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 742 | #define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU) |
89b66174 KM |
743 | #define rsnd_parse_connect_ctu(rdai, playback, capture) \ |
744 | rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get, \ | |
745 | rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \ | |
746 | playback, capture) | |
9269e3c3 | 747 | |
70fb1052 KM |
748 | /* |
749 | * R-Car MIX | |
750 | */ | |
2ea6b074 KM |
751 | int rsnd_mix_probe(struct rsnd_priv *priv); |
752 | void rsnd_mix_remove(struct rsnd_priv *priv); | |
70fb1052 | 753 | struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 754 | #define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX) |
89b66174 KM |
755 | #define rsnd_parse_connect_mix(rdai, playback, capture) \ |
756 | rsnd_parse_connect_common(rdai, rsnd_mix_mod_get, \ | |
757 | rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \ | |
758 | playback, capture) | |
70fb1052 | 759 | |
bff58ea4 KM |
760 | /* |
761 | * R-Car DVC | |
762 | */ | |
2ea6b074 KM |
763 | int rsnd_dvc_probe(struct rsnd_priv *priv); |
764 | void rsnd_dvc_remove(struct rsnd_priv *priv); | |
bff58ea4 | 765 | struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); |
be78cea1 | 766 | #define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC) |
89b66174 KM |
767 | #define rsnd_parse_connect_dvc(rdai, playback, capture) \ |
768 | rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get, \ | |
769 | rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \ | |
770 | playback, capture) | |
bff58ea4 | 771 | |
1b2ca0ad KM |
772 | /* |
773 | * R-Car CMD | |
774 | */ | |
2ea6b074 KM |
775 | int rsnd_cmd_probe(struct rsnd_priv *priv); |
776 | void rsnd_cmd_remove(struct rsnd_priv *priv); | |
1b2ca0ad KM |
777 | int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id); |
778 | struct rsnd_mod *rsnd_cmd_mod_get(struct rsnd_priv *priv, int id); | |
779 | ||
f1df1229 | 780 | void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); |
9ca5e57d | 781 | #ifdef DEBUG |
f1df1229 KM |
782 | #define rsnd_mod_confirm_ssi(mssi) rsnd_mod_make_sure(mssi, RSND_MOD_SSI) |
783 | #define rsnd_mod_confirm_src(msrc) rsnd_mod_make_sure(msrc, RSND_MOD_SRC) | |
784 | #define rsnd_mod_confirm_dvc(mdvc) rsnd_mod_make_sure(mdvc, RSND_MOD_DVC) | |
785 | #else | |
786 | #define rsnd_mod_confirm_ssi(mssi) | |
787 | #define rsnd_mod_confirm_src(msrc) | |
788 | #define rsnd_mod_confirm_dvc(mdvc) | |
789 | #endif | |
790 | ||
2b627869 KM |
791 | /* |
792 | * If you don't need interrupt status debug message, | |
793 | * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c | |
794 | * | |
795 | * #define RSND_DEBUG_NO_IRQ_STATUS 1 | |
796 | */ | |
797 | #define rsnd_dbg_irq_status(dev, param...) \ | |
798 | if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS)) \ | |
799 | dev_dbg(dev, param) | |
800 | ||
1f6e920f KM |
801 | /* |
802 | * If you don't need rsnd_dai_call debug message, | |
803 | * define RSND_DEBUG_NO_DAI_CALL as 1 on top of core.c | |
804 | * | |
805 | * #define RSND_DEBUG_NO_DAI_CALL 1 | |
806 | */ | |
807 | #define rsnd_dbg_dai_call(dev, param...) \ | |
808 | if (!IS_BUILTIN(RSND_DEBUG_NO_DAI_CALL)) \ | |
809 | dev_dbg(dev, param) | |
810 | ||
1536a968 | 811 | #endif |