]>
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/soc.h> |
25 | #include <sound/pcm_params.h> | |
26 | ||
dcc448e6 GU |
27 | #include "rcar_snd.h" |
28 | ||
1536a968 KM |
29 | /* |
30 | * pseudo register | |
31 | * | |
32 | * The register address offsets SRU/SCU/SSIU on Gen1/Gen2 are very different. | |
33 | * This driver uses pseudo register in order to hide it. | |
34 | * see gen1/gen2 for detail | |
35 | */ | |
3337744a | 36 | enum rsnd_reg { |
507d466c | 37 | /* SRU/SCU/SSIU */ |
07539c1d KM |
38 | RSND_REG_SSI_MODE0, |
39 | RSND_REG_SSI_MODE1, | |
0290d2a4 | 40 | RSND_REG_SRC_BUSIF_MODE, |
ef749400 KM |
41 | RSND_REG_SRC_ROUTE_MODE0, |
42 | RSND_REG_SRC_SWRSR, | |
43 | RSND_REG_SRC_SRCIR, | |
690ef81e | 44 | RSND_REG_SRC_ADINR, |
ef749400 KM |
45 | RSND_REG_SRC_IFSCR, |
46 | RSND_REG_SRC_IFSVR, | |
47 | RSND_REG_SRC_SRCCR, | |
cfcefe01 KM |
48 | RSND_REG_SCU_SYS_STATUS0, |
49 | RSND_REG_SCU_SYS_INT_EN0, | |
bff58ea4 | 50 | RSND_REG_CMD_ROUTE_SLCT, |
9269e3c3 KM |
51 | RSND_REG_CTU_CTUIR, |
52 | RSND_REG_CTU_ADINR, | |
70fb1052 KM |
53 | RSND_REG_MIX_SWRSR, |
54 | RSND_REG_MIX_MIXIR, | |
55 | RSND_REG_MIX_ADINR, | |
56 | RSND_REG_MIX_MIXMR, | |
57 | RSND_REG_MIX_MVPDR, | |
58 | RSND_REG_MIX_MDBAR, | |
59 | RSND_REG_MIX_MDBBR, | |
60 | RSND_REG_MIX_MDBCR, | |
61 | RSND_REG_MIX_MDBDR, | |
62 | RSND_REG_MIX_MDBER, | |
bff58ea4 KM |
63 | RSND_REG_DVC_SWRSR, |
64 | RSND_REG_DVC_DVUIR, | |
65 | RSND_REG_DVC_ADINR, | |
66 | RSND_REG_DVC_DVUCR, | |
67 | RSND_REG_DVC_ZCMCR, | |
68 | RSND_REG_DVC_VOL0R, | |
69 | RSND_REG_DVC_VOL1R, | |
70 | RSND_REG_DVC_DVUER, | |
07539c1d | 71 | |
dfc9403b KM |
72 | /* ADG */ |
73 | RSND_REG_BRRA, | |
74 | RSND_REG_BRRB, | |
75 | RSND_REG_SSICKR, | |
76 | RSND_REG_AUDIO_CLK_SEL0, | |
77 | RSND_REG_AUDIO_CLK_SEL1, | |
dfc9403b | 78 | |
ae5c3223 KM |
79 | /* SSI */ |
80 | RSND_REG_SSICR, | |
81 | RSND_REG_SSISR, | |
82 | RSND_REG_SSITDR, | |
83 | RSND_REG_SSIRDR, | |
84 | RSND_REG_SSIWSR, | |
85 | ||
c82e1c88 KM |
86 | /* SHARE see below */ |
87 | RSND_REG_SHARE01, | |
88 | RSND_REG_SHARE02, | |
89 | RSND_REG_SHARE03, | |
90 | RSND_REG_SHARE04, | |
91 | RSND_REG_SHARE05, | |
92 | RSND_REG_SHARE06, | |
93 | RSND_REG_SHARE07, | |
94 | RSND_REG_SHARE08, | |
95 | RSND_REG_SHARE09, | |
96 | RSND_REG_SHARE10, | |
97 | RSND_REG_SHARE11, | |
98 | RSND_REG_SHARE12, | |
99 | RSND_REG_SHARE13, | |
100 | RSND_REG_SHARE14, | |
101 | RSND_REG_SHARE15, | |
102 | RSND_REG_SHARE16, | |
103 | RSND_REG_SHARE17, | |
104 | RSND_REG_SHARE18, | |
105 | RSND_REG_SHARE19, | |
bff58ea4 KM |
106 | RSND_REG_SHARE20, |
107 | RSND_REG_SHARE21, | |
1cc71959 | 108 | RSND_REG_SHARE22, |
3539cacf KM |
109 | RSND_REG_SHARE23, |
110 | RSND_REG_SHARE24, | |
111 | RSND_REG_SHARE25, | |
cfcefe01 KM |
112 | RSND_REG_SHARE26, |
113 | RSND_REG_SHARE27, | |
114 | RSND_REG_SHARE28, | |
4689032b | 115 | RSND_REG_SHARE29, |
c82e1c88 | 116 | |
3337744a KM |
117 | RSND_REG_MAX, |
118 | }; | |
119 | ||
c82e1c88 KM |
120 | /* Gen1 only */ |
121 | #define RSND_REG_SRC_ROUTE_SEL RSND_REG_SHARE01 | |
122 | #define RSND_REG_SRC_TMG_SEL0 RSND_REG_SHARE02 | |
123 | #define RSND_REG_SRC_TMG_SEL1 RSND_REG_SHARE03 | |
124 | #define RSND_REG_SRC_TMG_SEL2 RSND_REG_SHARE04 | |
125 | #define RSND_REG_SRC_ROUTE_CTRL RSND_REG_SHARE05 | |
126 | #define RSND_REG_SRC_MNFSR RSND_REG_SHARE06 | |
127 | #define RSND_REG_AUDIO_CLK_SEL3 RSND_REG_SHARE07 | |
128 | #define RSND_REG_AUDIO_CLK_SEL4 RSND_REG_SHARE08 | |
129 | #define RSND_REG_AUDIO_CLK_SEL5 RSND_REG_SHARE09 | |
130 | ||
131 | /* Gen2 only */ | |
132 | #define RSND_REG_SRC_CTRL RSND_REG_SHARE01 | |
133 | #define RSND_REG_SSI_CTRL RSND_REG_SHARE02 | |
134 | #define RSND_REG_SSI_BUSIF_MODE RSND_REG_SHARE03 | |
135 | #define RSND_REG_SSI_BUSIF_ADINR RSND_REG_SHARE04 | |
efa991dc | 136 | #define RSND_REG_SSI_INT_ENABLE RSND_REG_SHARE05 |
c82e1c88 KM |
137 | #define RSND_REG_SRC_BSDSR RSND_REG_SHARE06 |
138 | #define RSND_REG_SRC_BSISR RSND_REG_SHARE07 | |
139 | #define RSND_REG_DIV_EN RSND_REG_SHARE08 | |
140 | #define RSND_REG_SRCIN_TIMSEL0 RSND_REG_SHARE09 | |
141 | #define RSND_REG_SRCIN_TIMSEL1 RSND_REG_SHARE10 | |
142 | #define RSND_REG_SRCIN_TIMSEL2 RSND_REG_SHARE11 | |
143 | #define RSND_REG_SRCIN_TIMSEL3 RSND_REG_SHARE12 | |
144 | #define RSND_REG_SRCIN_TIMSEL4 RSND_REG_SHARE13 | |
145 | #define RSND_REG_SRCOUT_TIMSEL0 RSND_REG_SHARE14 | |
146 | #define RSND_REG_SRCOUT_TIMSEL1 RSND_REG_SHARE15 | |
147 | #define RSND_REG_SRCOUT_TIMSEL2 RSND_REG_SHARE16 | |
148 | #define RSND_REG_SRCOUT_TIMSEL3 RSND_REG_SHARE17 | |
149 | #define RSND_REG_SRCOUT_TIMSEL4 RSND_REG_SHARE18 | |
150 | #define RSND_REG_AUDIO_CLK_SEL2 RSND_REG_SHARE19 | |
bff58ea4 KM |
151 | #define RSND_REG_CMD_CTRL RSND_REG_SHARE20 |
152 | #define RSND_REG_CMDOUT_TIMSEL RSND_REG_SHARE21 | |
cdde84d1 | 153 | #define RSND_REG_SSI_BUSIF_DALIGN RSND_REG_SHARE22 |
3539cacf KM |
154 | #define RSND_REG_DVC_VRCTR RSND_REG_SHARE23 |
155 | #define RSND_REG_DVC_VRPDR RSND_REG_SHARE24 | |
156 | #define RSND_REG_DVC_VRDBR RSND_REG_SHARE25 | |
cfcefe01 KM |
157 | #define RSND_REG_SCU_SYS_STATUS1 RSND_REG_SHARE26 |
158 | #define RSND_REG_SCU_SYS_INT_EN1 RSND_REG_SHARE27 | |
159 | #define RSND_REG_SRC_INT_ENABLE0 RSND_REG_SHARE28 | |
4689032b | 160 | #define RSND_REG_SRC_BUSIF_DALIGN RSND_REG_SHARE29 |
c82e1c88 | 161 | |
90e8e50f | 162 | struct rsnd_of_data; |
1536a968 | 163 | struct rsnd_priv; |
cdaa3cdf | 164 | struct rsnd_mod; |
1536a968 KM |
165 | struct rsnd_dai; |
166 | struct rsnd_dai_stream; | |
167 | ||
3337744a KM |
168 | /* |
169 | * R-Car basic functions | |
170 | */ | |
171 | #define rsnd_mod_read(m, r) \ | |
172 | rsnd_read(rsnd_mod_to_priv(m), m, RSND_REG_##r) | |
173 | #define rsnd_mod_write(m, r, d) \ | |
174 | rsnd_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) | |
7b47ab47 KM |
175 | #define rsnd_mod_force_write(m, r, d) \ |
176 | rsnd_force_write(rsnd_mod_to_priv(m), m, RSND_REG_##r, d) | |
3337744a KM |
177 | #define rsnd_mod_bset(m, r, s, d) \ |
178 | rsnd_bset(rsnd_mod_to_priv(m), m, RSND_REG_##r, s, d) | |
179 | ||
3337744a KM |
180 | u32 rsnd_read(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg); |
181 | void rsnd_write(struct rsnd_priv *priv, struct rsnd_mod *mod, | |
182 | enum rsnd_reg reg, u32 data); | |
7b47ab47 KM |
183 | void rsnd_force_write(struct rsnd_priv *priv, struct rsnd_mod *mod, |
184 | enum rsnd_reg reg, u32 data); | |
3337744a KM |
185 | void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, enum rsnd_reg reg, |
186 | u32 mask, u32 data); | |
3023b384 | 187 | u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
bfe1360d | 188 | u32 rsnd_get_adinr_chan(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
4689032b | 189 | u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io); |
e2c08416 KM |
190 | void rsnd_path_parse(struct rsnd_priv *priv, |
191 | struct rsnd_dai_stream *io); | |
3337744a | 192 | |
0a4d94c0 KM |
193 | /* |
194 | * R-Car DMA | |
195 | */ | |
3c68565b | 196 | struct rsnd_dma; |
3c68565b | 197 | |
0d00a521 | 198 | struct rsnd_dmaen { |
0a4d94c0 | 199 | struct dma_chan *chan; |
0d00a521 KM |
200 | }; |
201 | ||
202 | struct rsnd_dmapp { | |
288f392e KM |
203 | int dmapp_id; |
204 | u32 chcr; | |
0d00a521 KM |
205 | }; |
206 | ||
207 | struct rsnd_dma { | |
208 | struct rsnd_dma_ops *ops; | |
3c68565b KM |
209 | dma_addr_t src_addr; |
210 | dma_addr_t dst_addr; | |
0d00a521 KM |
211 | union { |
212 | struct rsnd_dmaen en; | |
213 | struct rsnd_dmapp pp; | |
214 | } dma; | |
0a4d94c0 | 215 | }; |
0d00a521 KM |
216 | #define rsnd_dma_to_dmaen(dma) (&(dma)->dma.en) |
217 | #define rsnd_dma_to_dmapp(dma) (&(dma)->dma.pp) | |
c25f20e1 | 218 | #define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma) |
0a4d94c0 | 219 | |
9b99e9a7 KM |
220 | void rsnd_dma_start(struct rsnd_dai_stream *io, struct rsnd_dma *dma); |
221 | void rsnd_dma_stop(struct rsnd_dai_stream *io, struct rsnd_dma *dma); | |
222 | int rsnd_dma_init(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id); | |
223 | void rsnd_dma_quit(struct rsnd_dai_stream *io, struct rsnd_dma *dma); | |
288f392e KM |
224 | int rsnd_dma_probe(struct platform_device *pdev, |
225 | const struct rsnd_of_data *of_data, | |
226 | struct rsnd_priv *priv); | |
72adc61f KM |
227 | struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, |
228 | struct rsnd_mod *mod, char *name); | |
0a4d94c0 | 229 | |
cdaa3cdf KM |
230 | /* |
231 | * R-Car sound mod | |
232 | */ | |
a126021d | 233 | enum rsnd_mod_type { |
8048b91f | 234 | RSND_MOD_DVC = 0, |
70fb1052 | 235 | RSND_MOD_MIX, |
9269e3c3 | 236 | RSND_MOD_CTU, |
8048b91f | 237 | RSND_MOD_SRC, |
a126021d KM |
238 | RSND_MOD_SSI, |
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); |
bff58ea4 | 264 | int (*pcm_new)(struct rsnd_mod *mod, |
2c0fac19 | 265 | struct rsnd_dai_stream *io, |
bff58ea4 | 266 | struct snd_soc_pcm_runtime *rtd); |
3b7843ff | 267 | int (*hw_params)(struct rsnd_mod *mod, |
2c0fac19 | 268 | struct rsnd_dai_stream *io, |
3b7843ff KM |
269 | struct snd_pcm_substream *substream, |
270 | struct snd_pcm_hw_params *hw_params); | |
97463e19 | 271 | int (*fallback)(struct rsnd_mod *mod, |
2c0fac19 | 272 | struct rsnd_dai_stream *io, |
690602fc | 273 | struct rsnd_priv *priv); |
cdaa3cdf KM |
274 | }; |
275 | ||
4686a0ad | 276 | struct rsnd_dai_stream; |
cdaa3cdf KM |
277 | struct rsnd_mod { |
278 | int id; | |
a126021d | 279 | enum rsnd_mod_type type; |
cdaa3cdf | 280 | struct rsnd_mod_ops *ops; |
0a4d94c0 | 281 | struct rsnd_dma dma; |
2099bc8e | 282 | struct rsnd_priv *priv; |
85642952 | 283 | struct clk *clk; |
417f9642 | 284 | u32 status; |
cdaa3cdf | 285 | }; |
417f9642 KM |
286 | /* |
287 | * status | |
288 | * | |
5451ea44 | 289 | * 0xH0000CBA |
3b7843ff | 290 | * |
5451ea44 KM |
291 | * A 0: probe 1: remove |
292 | * B 0: init 1: quit | |
293 | * C 0: start 1: stop | |
294 | * | |
295 | * H is always called (see __rsnd_mod_call) | |
296 | * H 0: pcm_new | |
297 | * H 0: fallback | |
298 | * H 0: hw_params | |
417f9642 KM |
299 | */ |
300 | #define __rsnd_mod_shift_probe 0 | |
301 | #define __rsnd_mod_shift_remove 0 | |
5451ea44 KM |
302 | #define __rsnd_mod_shift_init 4 |
303 | #define __rsnd_mod_shift_quit 4 | |
304 | #define __rsnd_mod_shift_start 8 | |
305 | #define __rsnd_mod_shift_stop 8 | |
306 | #define __rsnd_mod_shift_pcm_new 28 /* always called */ | |
307 | #define __rsnd_mod_shift_fallback 28 /* always called */ | |
308 | #define __rsnd_mod_shift_hw_params 28 /* always called */ | |
309 | ||
310 | #define __rsnd_mod_add_probe 1 | |
311 | #define __rsnd_mod_add_remove -1 | |
312 | #define __rsnd_mod_add_init 1 | |
313 | #define __rsnd_mod_add_quit -1 | |
314 | #define __rsnd_mod_add_start 1 | |
315 | #define __rsnd_mod_add_stop -1 | |
316 | #define __rsnd_mod_add_pcm_new 0 | |
317 | #define __rsnd_mod_add_fallback 0 | |
318 | #define __rsnd_mod_add_hw_params 0 | |
417f9642 KM |
319 | |
320 | #define __rsnd_mod_call_probe 0 | |
321 | #define __rsnd_mod_call_remove 1 | |
322 | #define __rsnd_mod_call_init 0 | |
323 | #define __rsnd_mod_call_quit 1 | |
324 | #define __rsnd_mod_call_start 0 | |
325 | #define __rsnd_mod_call_stop 1 | |
326 | #define __rsnd_mod_call_pcm_new 0 | |
327 | #define __rsnd_mod_call_fallback 0 | |
3b7843ff | 328 | #define __rsnd_mod_call_hw_params 0 |
cdaa3cdf | 329 | |
2099bc8e | 330 | #define rsnd_mod_to_priv(mod) ((mod)->priv) |
0a4d94c0 | 331 | #define rsnd_mod_to_dma(mod) (&(mod)->dma) |
72413c10 | 332 | #define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1) |
c9929345 KM |
333 | #define rsnd_mod_power_on(mod) clk_enable((mod)->clk) |
334 | #define rsnd_mod_power_off(mod) clk_disable((mod)->clk) | |
b76e218a | 335 | #define rsnd_mod_get(ip) (&(ip)->mod) |
cdaa3cdf | 336 | |
2099bc8e KM |
337 | int rsnd_mod_init(struct rsnd_priv *priv, |
338 | struct rsnd_mod *mod, | |
cdaa3cdf | 339 | struct rsnd_mod_ops *ops, |
85642952 | 340 | struct clk *clk, |
a126021d | 341 | enum rsnd_mod_type type, |
cdaa3cdf | 342 | int id); |
2f78dd7f | 343 | void rsnd_mod_quit(struct rsnd_mod *mod); |
cdaa3cdf | 344 | char *rsnd_mod_name(struct rsnd_mod *mod); |
9b99e9a7 KM |
345 | struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io, |
346 | struct rsnd_mod *mod); | |
f501b7a4 KM |
347 | void rsnd_mod_interrupt(struct rsnd_mod *mod, |
348 | void (*callback)(struct rsnd_mod *mod, | |
349 | struct rsnd_dai_stream *io)); | |
cdaa3cdf | 350 | |
1536a968 KM |
351 | /* |
352 | * R-Car sound DAI | |
353 | */ | |
354 | #define RSND_DAI_NAME_SIZE 16 | |
355 | struct rsnd_dai_stream { | |
f8c3c309 | 356 | char name[RSND_DAI_NAME_SIZE]; |
1536a968 | 357 | struct snd_pcm_substream *substream; |
a126021d | 358 | struct rsnd_mod *mod[RSND_MOD_MAX]; |
389933d9 | 359 | struct rsnd_dai_path_info *info; /* rcar_snd.h */ |
54cb5562 | 360 | struct rsnd_dai *rdai; |
1536a968 KM |
361 | int byte_pos; |
362 | int period_pos; | |
363 | int byte_per_period; | |
364 | int next_period_byte; | |
365 | }; | |
5cbbadd3 KM |
366 | #define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) |
367 | #define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) | |
368 | #define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) | |
9269e3c3 | 369 | #define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) |
70fb1052 | 370 | #define rsnd_io_to_mod_mix(io) rsnd_io_to_mod((io), RSND_MOD_MIX) |
5cbbadd3 | 371 | #define rsnd_io_to_mod_dvc(io) rsnd_io_to_mod((io), RSND_MOD_DVC) |
54cb5562 | 372 | #define rsnd_io_to_rdai(io) ((io)->rdai) |
1b13d118 | 373 | #define rsnd_io_to_priv(io) (rsnd_rdai_to_priv(rsnd_io_to_rdai(io))) |
985a4f6e | 374 | #define rsnd_io_is_play(io) (&rsnd_io_to_rdai(io)->playback == io) |
9d0e202f KM |
375 | #define rsnd_io_to_runtime(io) ((io)->substream ? \ |
376 | (io)->substream->runtime : NULL) | |
d5bbe7de | 377 | int rsnd_io_is_working(struct rsnd_dai_stream *io); |
985a4f6e | 378 | |
1536a968 KM |
379 | struct rsnd_dai { |
380 | char name[RSND_DAI_NAME_SIZE]; | |
1536a968 KM |
381 | struct rsnd_dai_stream playback; |
382 | struct rsnd_dai_stream capture; | |
1b13d118 | 383 | struct rsnd_priv *priv; |
1536a968 | 384 | |
a3737731 DC |
385 | unsigned int clk_master:1; |
386 | unsigned int bit_clk_inv:1; | |
387 | unsigned int frm_clk_inv:1; | |
388 | unsigned int sys_delay:1; | |
389 | unsigned int data_alignment:1; | |
1536a968 KM |
390 | }; |
391 | ||
ecba9e72 | 392 | #define rsnd_rdai_nr(priv) ((priv)->rdai_nr) |
3ed6448c | 393 | #define rsnd_rdai_is_clk_master(rdai) ((rdai)->clk_master) |
1b13d118 | 394 | #define rsnd_rdai_to_priv(rdai) ((rdai)->priv) |
1536a968 | 395 | #define for_each_rsnd_dai(rdai, priv, i) \ |
00463c11 | 396 | for (i = 0; \ |
ecba9e72 | 397 | (i < rsnd_rdai_nr(priv)) && \ |
710d0889 | 398 | ((rdai) = rsnd_rdai_get(priv, i)); \ |
00463c11 | 399 | i++) |
1536a968 | 400 | |
710d0889 KM |
401 | struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id); |
402 | ||
75defee0 KM |
403 | bool rsnd_dai_pointer_update(struct rsnd_dai_stream *io, int cnt); |
404 | void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io); | |
1536a968 KM |
405 | int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional); |
406 | ||
3337744a KM |
407 | /* |
408 | * R-Car Gen1/Gen2 | |
409 | */ | |
410 | int rsnd_gen_probe(struct platform_device *pdev, | |
90e8e50f | 411 | const struct rsnd_of_data *of_data, |
3337744a | 412 | struct rsnd_priv *priv); |
3337744a KM |
413 | void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv, |
414 | struct rsnd_mod *mod, | |
415 | enum rsnd_reg reg); | |
c5212b45 | 416 | phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id); |
ad32d0c7 | 417 | |
c5d5a58d KM |
418 | #define rsnd_is_gen1(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN1) |
419 | #define rsnd_is_gen2(s) (((s)->info->flags & RSND_GEN_MASK) == RSND_GEN2) | |
3337744a | 420 | |
dfc9403b KM |
421 | /* |
422 | * R-Car ADG | |
423 | */ | |
424 | int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod); | |
425 | int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate); | |
426 | int rsnd_adg_probe(struct platform_device *pdev, | |
90e8e50f | 427 | const struct rsnd_of_data *of_data, |
dfc9403b | 428 | struct rsnd_priv *priv); |
28dc4b63 KM |
429 | int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv, |
430 | struct rsnd_mod *mod, | |
431 | unsigned int src_rate, | |
432 | unsigned int dst_rate); | |
629509c5 | 433 | int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod, |
629509c5 KM |
434 | struct rsnd_dai_stream *io, |
435 | unsigned int src_rate, | |
436 | unsigned int dst_rate); | |
437 | int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod, | |
629509c5 | 438 | struct rsnd_dai_stream *io); |
f708d944 | 439 | int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, |
bff58ea4 | 440 | struct rsnd_dai_stream *io); |
dfc9403b | 441 | |
1536a968 KM |
442 | /* |
443 | * R-Car sound priv | |
444 | */ | |
90e8e50f KM |
445 | struct rsnd_of_data { |
446 | u32 flags; | |
447 | }; | |
448 | ||
1536a968 KM |
449 | struct rsnd_priv { |
450 | ||
9f464f8e | 451 | struct platform_device *pdev; |
1536a968 KM |
452 | struct rcar_snd_info *info; |
453 | spinlock_t lock; | |
454 | ||
3337744a KM |
455 | /* |
456 | * below value will be filled on rsnd_gen_probe() | |
457 | */ | |
458 | void *gen; | |
459 | ||
dfc9403b KM |
460 | /* |
461 | * below value will be filled on rsnd_adg_probe() | |
462 | */ | |
463 | void *adg; | |
464 | ||
288f392e KM |
465 | /* |
466 | * below value will be filled on rsnd_dma_probe() | |
467 | */ | |
468 | void *dma; | |
469 | ||
ae5c3223 KM |
470 | /* |
471 | * below value will be filled on rsnd_ssi_probe() | |
472 | */ | |
dd27d808 KM |
473 | void *ssi; |
474 | int ssi_nr; | |
ae5c3223 | 475 | |
78edead4 KM |
476 | /* |
477 | * below value will be filled on rsnd_src_probe() | |
478 | */ | |
479 | void *src; | |
480 | int src_nr; | |
481 | ||
9269e3c3 KM |
482 | /* |
483 | * below value will be filled on rsnd_ctu_probe() | |
484 | */ | |
485 | void *ctu; | |
486 | int ctu_nr; | |
487 | ||
70fb1052 KM |
488 | /* |
489 | * below value will be filled on rsnd_mix_probe() | |
490 | */ | |
491 | void *mix; | |
492 | int mix_nr; | |
493 | ||
bff58ea4 KM |
494 | /* |
495 | * below value will be filled on rsnd_dvc_probe() | |
496 | */ | |
497 | void *dvc; | |
498 | int dvc_nr; | |
499 | ||
1536a968 KM |
500 | /* |
501 | * below value will be filled on rsnd_dai_probe() | |
502 | */ | |
503 | struct snd_soc_dai_driver *daidrv; | |
504 | struct rsnd_dai *rdai; | |
ecba9e72 | 505 | int rdai_nr; |
1536a968 KM |
506 | }; |
507 | ||
9f464f8e KM |
508 | #define rsnd_priv_to_pdev(priv) ((priv)->pdev) |
509 | #define rsnd_priv_to_dev(priv) (&(rsnd_priv_to_pdev(priv)->dev)) | |
5da39cf3 | 510 | #define rsnd_priv_to_info(priv) ((priv)->info) |
1536a968 | 511 | |
170a2497 KM |
512 | /* |
513 | * rsnd_kctrl | |
514 | */ | |
515 | struct rsnd_kctrl_cfg { | |
516 | unsigned int max; | |
517 | unsigned int size; | |
518 | u32 *val; | |
519 | const char * const *texts; | |
b65a7ccc KM |
520 | void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod); |
521 | struct rsnd_dai_stream *io; | |
d1f83d6e KM |
522 | struct snd_card *card; |
523 | struct snd_kcontrol *kctrl; | |
170a2497 KM |
524 | }; |
525 | ||
526 | #define RSND_DVC_CHANNELS 2 | |
527 | struct rsnd_kctrl_cfg_m { | |
528 | struct rsnd_kctrl_cfg cfg; | |
529 | u32 val[RSND_DVC_CHANNELS]; | |
530 | }; | |
531 | ||
532 | struct rsnd_kctrl_cfg_s { | |
533 | struct rsnd_kctrl_cfg cfg; | |
534 | u32 val; | |
535 | }; | |
536 | ||
d1f83d6e KM |
537 | void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg); |
538 | #define rsnd_kctrl_remove(_cfg) _rsnd_kctrl_remove(&((_cfg).cfg)) | |
539 | ||
170a2497 | 540 | int rsnd_kctrl_new_m(struct rsnd_mod *mod, |
b65a7ccc | 541 | struct rsnd_dai_stream *io, |
170a2497 KM |
542 | struct snd_soc_pcm_runtime *rtd, |
543 | const unsigned char *name, | |
b65a7ccc KM |
544 | void (*update)(struct rsnd_dai_stream *io, |
545 | struct rsnd_mod *mod), | |
170a2497 KM |
546 | struct rsnd_kctrl_cfg_m *_cfg, |
547 | u32 max); | |
548 | int rsnd_kctrl_new_s(struct rsnd_mod *mod, | |
b65a7ccc | 549 | struct rsnd_dai_stream *io, |
170a2497 KM |
550 | struct snd_soc_pcm_runtime *rtd, |
551 | const unsigned char *name, | |
b65a7ccc KM |
552 | void (*update)(struct rsnd_dai_stream *io, |
553 | struct rsnd_mod *mod), | |
170a2497 KM |
554 | struct rsnd_kctrl_cfg_s *_cfg, |
555 | u32 max); | |
556 | int rsnd_kctrl_new_e(struct rsnd_mod *mod, | |
b65a7ccc | 557 | struct rsnd_dai_stream *io, |
170a2497 KM |
558 | struct snd_soc_pcm_runtime *rtd, |
559 | const unsigned char *name, | |
560 | struct rsnd_kctrl_cfg_s *_cfg, | |
b65a7ccc KM |
561 | void (*update)(struct rsnd_dai_stream *io, |
562 | struct rsnd_mod *mod), | |
170a2497 KM |
563 | const char * const *texts, |
564 | u32 max); | |
565 | ||
78edead4 KM |
566 | /* |
567 | * R-Car SSI | |
568 | */ | |
569 | int rsnd_ssi_probe(struct platform_device *pdev, | |
570 | const struct rsnd_of_data *of_data, | |
571 | struct rsnd_priv *priv); | |
572 | void rsnd_ssi_remove(struct platform_device *pdev, | |
573 | struct rsnd_priv *priv); | |
574 | struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); | |
78edead4 | 575 | int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); |
b415b4d3 KM |
576 | int rsnd_ssi_use_busif(struct rsnd_dai_stream *io); |
577 | ||
578 | #define rsnd_ssi_is_pin_sharing(io) \ | |
579 | __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) | |
580 | int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); | |
78edead4 | 581 | |
07539c1d | 582 | /* |
ba9c949f | 583 | * R-Car SRC |
07539c1d | 584 | */ |
ba9c949f | 585 | int rsnd_src_probe(struct platform_device *pdev, |
90e8e50f | 586 | const struct rsnd_of_data *of_data, |
07539c1d | 587 | struct rsnd_priv *priv); |
2f78dd7f KM |
588 | void rsnd_src_remove(struct platform_device *pdev, |
589 | struct rsnd_priv *priv); | |
ba9c949f KM |
590 | struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); |
591 | unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, | |
374e5426 | 592 | struct rsnd_dai_stream *io, |
ef749400 | 593 | struct snd_pcm_runtime *runtime); |
d9288d0b | 594 | int rsnd_src_ssiu_start(struct rsnd_mod *ssi_mod, |
4e2639ff | 595 | struct rsnd_dai_stream *io, |
d9288d0b | 596 | int use_busif); |
4e2639ff KM |
597 | int rsnd_src_ssiu_stop(struct rsnd_mod *ssi_mod, |
598 | struct rsnd_dai_stream *io); | |
f708d944 KM |
599 | int rsnd_src_ssi_irq_enable(struct rsnd_mod *ssi_mod); |
600 | int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod); | |
ef749400 | 601 | |
9269e3c3 KM |
602 | /* |
603 | * R-Car CTU | |
604 | */ | |
605 | int rsnd_ctu_probe(struct platform_device *pdev, | |
606 | const struct rsnd_of_data *of_data, | |
607 | struct rsnd_priv *priv); | |
608 | ||
609 | void rsnd_ctu_remove(struct platform_device *pdev, | |
610 | struct rsnd_priv *priv); | |
611 | struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); | |
612 | ||
70fb1052 KM |
613 | /* |
614 | * R-Car MIX | |
615 | */ | |
616 | int rsnd_mix_probe(struct platform_device *pdev, | |
617 | const struct rsnd_of_data *of_data, | |
618 | struct rsnd_priv *priv); | |
619 | ||
620 | void rsnd_mix_remove(struct platform_device *pdev, | |
621 | struct rsnd_priv *priv); | |
622 | struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); | |
623 | ||
bff58ea4 KM |
624 | /* |
625 | * R-Car DVC | |
626 | */ | |
627 | int rsnd_dvc_probe(struct platform_device *pdev, | |
628 | const struct rsnd_of_data *of_data, | |
629 | struct rsnd_priv *priv); | |
630 | void rsnd_dvc_remove(struct platform_device *pdev, | |
631 | struct rsnd_priv *priv); | |
632 | struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); | |
633 | ||
f1df1229 KM |
634 | #ifdef DEBUG |
635 | void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type); | |
636 | #define rsnd_mod_confirm_ssi(mssi) rsnd_mod_make_sure(mssi, RSND_MOD_SSI) | |
637 | #define rsnd_mod_confirm_src(msrc) rsnd_mod_make_sure(msrc, RSND_MOD_SRC) | |
638 | #define rsnd_mod_confirm_dvc(mdvc) rsnd_mod_make_sure(mdvc, RSND_MOD_DVC) | |
639 | #else | |
640 | #define rsnd_mod_confirm_ssi(mssi) | |
641 | #define rsnd_mod_confirm_src(msrc) | |
642 | #define rsnd_mod_confirm_dvc(mdvc) | |
643 | #endif | |
644 | ||
1536a968 | 645 | #endif |