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 KM |
20 | #include <linux/of_device.h> |
21 | #include <linux/of_irq.h> | |
0a4d94c0 KM |
22 | #include <linux/sh_dma.h> |
23 | #include <linux/workqueue.h> | |
1536a968 KM |
24 | #include <sound/rcar_snd.h> |
25 | #include <sound/soc.h> | |
26 | #include <sound/pcm_params.h> | |
27 | ||
28 | /* | |
29 | * pseudo register | |
30 | * | |
31 | * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. | |
32 | * This driver uses pseudo register in order to hide it. | |
33 | * see gen1/gen2 for detail | |
34 | */ | |
3337744a | 35 | enum rsnd_reg { |
507d466c | 36 | /* SRU/SCU/SSIU */ |
07539c1d KM |
37 | RSND_REG_SSI_MODE0, |
38 | RSND_REG_SSI_MODE1, | |
0290d2a4 | 39 | RSND_REG_SRC_BUSIF_MODE, |
ef749400 KM |
40 | RSND_REG_SRC_ROUTE_MODE0, |
41 | RSND_REG_SRC_SWRSR, | |
42 | RSND_REG_SRC_SRCIR, | |
690ef81e | 43 | RSND_REG_SRC_ADINR, |
ef749400 KM |
44 | RSND_REG_SRC_IFSCR, |
45 | RSND_REG_SRC_IFSVR, | |
46 | RSND_REG_SRC_SRCCR, | |
bff58ea4 KM |
47 | RSND_REG_CMD_ROUTE_SLCT, |
48 | RSND_REG_DVC_SWRSR, | |
49 | RSND_REG_DVC_DVUIR, | |
50 | RSND_REG_DVC_ADINR, | |
51 | RSND_REG_DVC_DVUCR, | |
52 | RSND_REG_DVC_ZCMCR, | |
53 | RSND_REG_DVC_VOL0R, | |
54 | RSND_REG_DVC_VOL1R, | |
55 | RSND_REG_DVC_DVUER, | |
07539c1d | 56 | |
dfc9403b KM |
57 | /* ADG */ |
58 | RSND_REG_BRRA, | |
59 | RSND_REG_BRRB, | |
60 | RSND_REG_SSICKR, | |
61 | RSND_REG_AUDIO_CLK_SEL0, | |
62 | RSND_REG_AUDIO_CLK_SEL1, | |
dfc9403b | 63 | |
ae5c3223 KM |
64 | /* SSI */ |
65 | RSND_REG_SSICR, | |
66 | RSND_REG_SSISR, | |
67 | RSND_REG_SSITDR, | |
68 | RSND_REG_SSIRDR, | |
69 | RSND_REG_SSIWSR, | |
70 | ||
c82e1c88 KM |
71 | /* SHARE see below */ |
72 | RSND_REG_SHARE01, | |
73 | RSND_REG_SHARE02, | |
74 | RSND_REG_SHARE03, | |
75 | RSND_REG_SHARE04, | |
76 | RSND_REG_SHARE05, | |
77 | RSND_REG_SHARE06, | |
78 | RSND_REG_SHARE07, | |
79 | RSND_REG_SHARE08, | |
80 | RSND_REG_SHARE09, | |
81 | RSND_REG_SHARE10, | |
82 | RSND_REG_SHARE11, | |
83 | RSND_REG_SHARE12, | |
84 | RSND_REG_SHARE13, | |
85 | RSND_REG_SHARE14, | |
86 | RSND_REG_SHARE15, | |
87 | RSND_REG_SHARE16, | |
88 | RSND_REG_SHARE17, | |
89 | RSND_REG_SHARE18, | |
90 | RSND_REG_SHARE19, | |
bff58ea4 KM |
91 | RSND_REG_SHARE20, |
92 | RSND_REG_SHARE21, | |
1cc71959 | 93 | RSND_REG_SHARE22, |
c82e1c88 | 94 | |
3337744a KM |
95 | RSND_REG_MAX, |
96 | }; | |
97 | ||
c82e1c88 KM |
98 | /* Gen1 only */ |
99 | #define RSND_REG_SRC_ROUTE_SEL RSND_REG_SHARE01 | |
100 | #define RSND_REG_SRC_TMG_SEL0 RSND_REG_SHARE02 | |
101 | #define RSND_REG_SRC_TMG_SEL1 RSND_REG_SHARE03 | |
102 | #define RSND_REG_SRC_TMG_SEL2 RSND_REG_SHARE04 | |
103 | #define RSND_REG_SRC_ROUTE_CTRL RSND_REG_SHARE05 | |
104 | #define RSND_REG_SRC_MNFSR RSND_REG_SHARE06 | |
105 | #define RSND_REG_AUDIO_CLK_SEL3 RSND_REG_SHARE07 | |
106 | #define RSND_REG_AUDIO_CLK_SEL4 RSND_REG_SHARE08 | |
107 | #define RSND_REG_AUDIO_CLK_SEL5 RSND_REG_SHARE09 | |
108 | ||
109 | /* Gen2 only */ | |
110 | #define RSND_REG_SRC_CTRL RSND_REG_SHARE01 | |
111 | #define RSND_REG_SSI_CTRL RSND_REG_SHARE02 | |
112 | #define RSND_REG_SSI_BUSIF_MODE RSND_REG_SHARE03 | |
113 | #define RSND_REG_SSI_BUSIF_ADINR RSND_REG_SHARE04 | |
114 | #define RSND_REG_INT_ENABLE RSND_REG_SHARE05 | |
115 | #define RSND_REG_SRC_BSDSR RSND_REG_SHARE06 | |
116 | #define RSND_REG_SRC_BSISR RSND_REG_SHARE07 | |
117 | #define RSND_REG_DIV_EN RSND_REG_SHARE08 | |
118 | #define RSND_REG_SRCIN_TIMSEL0 RSND_REG_SHARE09 | |
119 | #define RSND_REG_SRCIN_TIMSEL1 RSND_REG_SHARE10 | |
120 | #define RSND_REG_SRCIN_TIMSEL2 RSND_REG_SHARE11 | |
121 | #define RSND_REG_SRCIN_TIMSEL3 RSND_REG_SHARE12 | |
122 | #define RSND_REG_SRCIN_TIMSEL4 RSND_REG_SHARE13 | |
123 | #define RSND_REG_SRCOUT_TIMSEL0 RSND_REG_SHARE14 | |
124 | #define RSND_REG_SRCOUT_TIMSEL1 RSND_REG_SHARE15 | |
125 | #define RSND_REG_SRCOUT_TIMSEL2 RSND_REG_SHARE16 | |
126 | #define RSND_REG_SRCOUT_TIMSEL3 RSND_REG_SHARE17 | |
127 | #define RSND_REG_SRCOUT_TIMSEL4 RSND_REG_SHARE18 | |
128 | #define RSND_REG_AUDIO_CLK_SEL2 RSND_REG_SHARE19 | |
bff58ea4 KM |
129 | #define RSND_REG_CMD_CTRL RSND_REG_SHARE20 |
130 | #define RSND_REG_CMDOUT_TIMSEL RSND_REG_SHARE21 | |
1cc71959 | 131 | #define RSND_REG_BUSIF_DALIGN RSND_REG_SHARE22 |
c82e1c88 | 132 | |
90e8e50f | 133 | struct rsnd_of_data; |
1536a968 | 134 | struct rsnd_priv; |
cdaa3cdf | 135 | struct rsnd_mod; |
1536a968 KM |
136 | struct rsnd_dai; |
137 | struct rsnd_dai_stream; | |
138 | ||
3337744a KM |
139 | /* |
140 | * R-Car basic functions | |
141 | */ | |
142 | #define rsnd_mod_read(m, r) \ | |
143 | rsnd_read(rsnd_mod_to_priv(m), m, RSND_REG_##r) | |
144 | #define rsnd_mod_write(m, r, d) \ | |
145 | rsnd_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) | |
146 | #define rsnd_mod_bset(m, r, s, d) \ | |
147 | rsnd_bset(rsnd_mod_to_priv(m), m, RSND_REG_##r, s, d) | |
148 | ||
3337744a KM |
149 | u32 rsnd_read(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg); |
150 | void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod, | |
151 | enum rsnd_reg reg, u32 data); | |
152 | void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg, | |
153 | u32 mask, u32 data); | |
d7bdbc5d | 154 | u32 rsnd_get_adinr(struct rsnd_mod *mod); |
3337744a | 155 | |
0a4d94c0 KM |
156 | /* |
157 | * R-Car DMA | |
158 | */ | |
159 | struct rsnd_dma { | |
0a4d94c0 | 160 | struct sh_dmae_slave slave; |
0a4d94c0 | 161 | struct dma_chan *chan; |
cd7bcc60 | 162 | enum dma_transfer_direction dir; |
34037100 | 163 | dma_addr_t addr; |
0a4d94c0 KM |
164 | }; |
165 | ||
166 | void rsnd_dma_start(struct rsnd_dma *dma); | |
167 | void rsnd_dma_stop(struct rsnd_dma *dma); | |
168 | int rsnd_dma_available(struct rsnd_dma *dma); | |
169 | int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma, | |
4686a0ad | 170 | int is_play, int id); |
0a4d94c0 KM |
171 | void rsnd_dma_quit(struct rsnd_priv *priv, |
172 | struct rsnd_dma *dma); | |
173 | ||
174 | ||
cdaa3cdf KM |
175 | /* |
176 | * R-Car sound mod | |
177 | */ | |
a126021d | 178 | enum rsnd_mod_type { |
ba9c949f | 179 | RSND_MOD_SRC = 0, |
a126021d | 180 | RSND_MOD_SSI, |
bff58ea4 | 181 | RSND_MOD_DVC, |
a126021d KM |
182 | RSND_MOD_MAX, |
183 | }; | |
cdaa3cdf KM |
184 | |
185 | struct rsnd_mod_ops { | |
186 | char *name; | |
d9288d0b | 187 | char* (*dma_name)(struct rsnd_mod *mod); |
7681f6ac | 188 | int (*probe)(struct rsnd_mod *mod, |
b42fccf6 | 189 | struct rsnd_dai *rdai); |
7681f6ac | 190 | int (*remove)(struct rsnd_mod *mod, |
b42fccf6 | 191 | struct rsnd_dai *rdai); |
cdaa3cdf | 192 | int (*init)(struct rsnd_mod *mod, |
b42fccf6 | 193 | struct rsnd_dai *rdai); |
cdaa3cdf | 194 | int (*quit)(struct rsnd_mod *mod, |
b42fccf6 | 195 | struct rsnd_dai *rdai); |
cdaa3cdf | 196 | int (*start)(struct rsnd_mod *mod, |
b42fccf6 | 197 | struct rsnd_dai *rdai); |
cdaa3cdf | 198 | int (*stop)(struct rsnd_mod *mod, |
b42fccf6 | 199 | struct rsnd_dai *rdai); |
bff58ea4 KM |
200 | int (*pcm_new)(struct rsnd_mod *mod, |
201 | struct rsnd_dai *rdai, | |
202 | struct snd_soc_pcm_runtime *rtd); | |
cdaa3cdf KM |
203 | }; |
204 | ||
4686a0ad | 205 | struct rsnd_dai_stream; |
cdaa3cdf KM |
206 | struct rsnd_mod { |
207 | int id; | |
a126021d | 208 | enum rsnd_mod_type type; |
cdaa3cdf KM |
209 | struct rsnd_priv *priv; |
210 | struct rsnd_mod_ops *ops; | |
0a4d94c0 | 211 | struct rsnd_dma dma; |
4686a0ad | 212 | struct rsnd_dai_stream *io; |
cdaa3cdf KM |
213 | }; |
214 | ||
215 | #define rsnd_mod_to_priv(mod) ((mod)->priv) | |
0a4d94c0 KM |
216 | #define rsnd_mod_to_dma(mod) (&(mod)->dma) |
217 | #define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma) | |
4686a0ad | 218 | #define rsnd_mod_to_io(mod) ((mod)->io) |
cdaa3cdf | 219 | #define rsnd_mod_id(mod) ((mod)->id) |
cdaa3cdf KM |
220 | |
221 | void rsnd_mod_init(struct rsnd_priv *priv, | |
222 | struct rsnd_mod *mod, | |
223 | struct rsnd_mod_ops *ops, | |
a126021d | 224 | enum rsnd_mod_type type, |
cdaa3cdf KM |
225 | int id); |
226 | char *rsnd_mod_name(struct rsnd_mod *mod); | |
d9288d0b | 227 | char *rsnd_mod_dma_name(struct rsnd_mod *mod); |
cdaa3cdf | 228 | |
1536a968 KM |
229 | /* |
230 | * R-Car sound DAI | |
231 | */ | |
232 | #define RSND_DAI_NAME_SIZE 16 | |
233 | struct rsnd_dai_stream { | |
1536a968 | 234 | struct snd_pcm_substream *substream; |
a126021d | 235 | struct rsnd_mod *mod[RSND_MOD_MAX]; |
389933d9 | 236 | struct rsnd_dai_path_info *info; /* rcar_snd.h */ |
1536a968 KM |
237 | int byte_pos; |
238 | int period_pos; | |
239 | int byte_per_period; | |
240 | int next_period_byte; | |
241 | }; | |
374e5426 | 242 | #define rsnd_io_to_mod_ssi(io) ((io)->mod[RSND_MOD_SSI]) |
ba9c949f | 243 | #define rsnd_io_to_mod_src(io) ((io)->mod[RSND_MOD_SRC]) |
bff58ea4 | 244 | #define rsnd_io_to_mod_dvc(io) ((io)->mod[RSND_MOD_DVC]) |
1536a968 KM |
245 | |
246 | struct rsnd_dai { | |
247 | char name[RSND_DAI_NAME_SIZE]; | |
248 | struct rsnd_dai_platform_info *info; /* rcar_snd.h */ | |
249 | struct rsnd_dai_stream playback; | |
250 | struct rsnd_dai_stream capture; | |
251 | ||
a3737731 DC |
252 | unsigned int clk_master:1; |
253 | unsigned int bit_clk_inv:1; | |
254 | unsigned int frm_clk_inv:1; | |
255 | unsigned int sys_delay:1; | |
256 | unsigned int data_alignment:1; | |
1536a968 KM |
257 | }; |
258 | ||
ecba9e72 | 259 | #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) |
1536a968 | 260 | #define for_each_rsnd_dai(rdai, priv, i) \ |
00463c11 | 261 | for (i = 0; \ |
ecba9e72 | 262 | (i < rsnd_rdai_nr(priv)) && \ |
00463c11 KM |
263 | ((rdai) = rsnd_dai_get(priv, i)); \ |
264 | i++) | |
1536a968 KM |
265 | |
266 | struct rsnd_dai *rsnd_dai_get(struct rsnd_priv *priv, int id); | |
267 | int rsnd_dai_is_play(struct rsnd_dai *rdai, struct rsnd_dai_stream *io); | |
4b4dab82 | 268 | int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai); |
1536a968 | 269 | #define rsnd_dai_get_platform_info(rdai) ((rdai)->info) |
ae5c3223 | 270 | #define rsnd_io_to_runtime(io) ((io)->substream->runtime) |
1536a968 KM |
271 | |
272 | void rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt); | |
273 | int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional); | |
e779a20d | 274 | #define rsnd_dai_is_clk_master(rdai) ((rdai)->clk_master) |
1536a968 | 275 | |
3337744a KM |
276 | /* |
277 | * R-Car Gen1/Gen2 | |
278 | */ | |
279 | int rsnd_gen_probe(struct platform_device *pdev, | |
90e8e50f | 280 | const struct rsnd_of_data *of_data, |
3337744a | 281 | struct rsnd_priv *priv); |
3337744a KM |
282 | void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, |
283 | struct rsnd_mod *mod, | |
284 | enum rsnd_reg reg); | |
37523034 KM |
285 | dma_addr_t rsnd_gen_dma_addr(struct rsnd_priv *priv, |
286 | struct rsnd_mod *mod, | |
287 | int is_play, int is_from); | |
ad32d0c7 | 288 | |
c5d5a58d KM |
289 | #define rsnd_is_gen1(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN1) |
290 | #define rsnd_is_gen2(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN2) | |
3337744a | 291 | |
dfc9403b KM |
292 | /* |
293 | * R-Car ADG | |
294 | */ | |
295 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod); | |
296 | int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate); | |
297 | int rsnd_adg_probe(struct platform_device *pdev, | |
90e8e50f | 298 | const struct rsnd_of_data *of_data, |
dfc9403b | 299 | struct rsnd_priv *priv); |
28dc4b63 KM |
300 | int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv, |
301 | struct rsnd_mod *mod, | |
302 | unsigned int src_rate, | |
303 | unsigned int dst_rate); | |
629509c5 KM |
304 | int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, |
305 | struct rsnd_dai *rdai, | |
306 | struct rsnd_dai_stream *io, | |
307 | unsigned int src_rate, | |
308 | unsigned int dst_rate); | |
309 | int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod, | |
310 | struct rsnd_dai *rdai, | |
311 | struct rsnd_dai_stream *io); | |
bff58ea4 KM |
312 | int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_dai *rdai, |
313 | struct rsnd_mod *mod, | |
314 | struct rsnd_dai_stream *io); | |
dfc9403b | 315 | |
1536a968 KM |
316 | /* |
317 | * R-Car sound priv | |
318 | */ | |
90e8e50f KM |
319 | struct rsnd_of_data { |
320 | u32 flags; | |
321 | }; | |
322 | ||
1536a968 KM |
323 | struct rsnd_priv { |
324 | ||
9f464f8e | 325 | struct platform_device *pdev; |
1536a968 KM |
326 | struct rcar_snd_info *info; |
327 | spinlock_t lock; | |
328 | ||
3337744a KM |
329 | /* |
330 | * below value will be filled on rsnd_gen_probe() | |
331 | */ | |
332 | void *gen; | |
333 | ||
07539c1d | 334 | /* |
ba9c949f | 335 | * below value will be filled on rsnd_src_probe() |
07539c1d | 336 | */ |
ba9c949f KM |
337 | void *src; |
338 | int src_nr; | |
07539c1d | 339 | |
dfc9403b KM |
340 | /* |
341 | * below value will be filled on rsnd_adg_probe() | |
342 | */ | |
343 | void *adg; | |
344 | ||
ae5c3223 KM |
345 | /* |
346 | * below value will be filled on rsnd_ssi_probe() | |
347 | */ | |
dd27d808 KM |
348 | void *ssi; |
349 | int ssi_nr; | |
ae5c3223 | 350 | |
bff58ea4 KM |
351 | /* |
352 | * below value will be filled on rsnd_dvc_probe() | |
353 | */ | |
354 | void *dvc; | |
355 | int dvc_nr; | |
356 | ||
1536a968 KM |
357 | /* |
358 | * below value will be filled on rsnd_dai_probe() | |
359 | */ | |
360 | struct snd_soc_dai_driver *daidrv; | |
361 | struct rsnd_dai *rdai; | |
ecba9e72 | 362 | int rdai_nr; |
1536a968 KM |
363 | }; |
364 | ||
9f464f8e KM |
365 | #define rsnd_priv_to_pdev(priv) ((priv)->pdev) |
366 | #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) | |
5da39cf3 | 367 | #define rsnd_priv_to_info(priv) ((priv)->info) |
1536a968 KM |
368 | #define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags) |
369 | #define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags) | |
370 | ||
389933d9 KM |
371 | #define rsnd_info_is_playback(priv, type) \ |
372 | ({ \ | |
373 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); \ | |
374 | int i, is_play = 0; \ | |
375 | for (i = 0; i < info->dai_info_nr; i++) { \ | |
376 | if (info->dai_info[i].playback.type == (type)->info) { \ | |
377 | is_play = 1; \ | |
378 | break; \ | |
379 | } \ | |
380 | } \ | |
381 | is_play; \ | |
382 | }) | |
383 | ||
07539c1d | 384 | /* |
ba9c949f | 385 | * R-Car SRC |
07539c1d | 386 | */ |
ba9c949f | 387 | int rsnd_src_probe(struct platform_device *pdev, |
90e8e50f | 388 | const struct rsnd_of_data *of_data, |
07539c1d | 389 | struct rsnd_priv *priv); |
ba9c949f KM |
390 | struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); |
391 | unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, | |
374e5426 | 392 | struct rsnd_dai_stream *io, |
ef749400 | 393 | struct snd_pcm_runtime *runtime); |
d9288d0b KM |
394 | int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod, |
395 | struct rsnd_dai *rdai, | |
396 | int use_busif); | |
397 | int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod, | |
398 | struct rsnd_dai *rdai, | |
399 | int use_busif); | |
ba9c949f | 400 | int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod, |
b42fccf6 | 401 | struct rsnd_dai *rdai); |
ef749400 | 402 | |
ba9c949f | 403 | #define rsnd_src_nr(priv) ((priv)->src_nr) |
07539c1d | 404 | |
ae5c3223 KM |
405 | /* |
406 | * R-Car SSI | |
407 | */ | |
408 | int rsnd_ssi_probe(struct platform_device *pdev, | |
90e8e50f | 409 | const struct rsnd_of_data *of_data, |
ae5c3223 | 410 | struct rsnd_priv *priv); |
ae5c3223 | 411 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); |
7b5ce975 | 412 | int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); |
ae5c3223 | 413 | |
bff58ea4 KM |
414 | /* |
415 | * R-Car DVC | |
416 | */ | |
417 | int rsnd_dvc_probe(struct platform_device *pdev, | |
418 | const struct rsnd_of_data *of_data, | |
419 | struct rsnd_priv *priv); | |
420 | void rsnd_dvc_remove(struct platform_device *pdev, | |
421 | struct rsnd_priv *priv); | |
422 | struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); | |
423 | ||
424 | #define rsnd_dvc_nr(priv) ((priv)->dvc_nr) | |
425 | ||
426 | ||
1536a968 | 427 | #endif |