]> Git Repo - linux.git/blame - sound/soc/sh/rcar/rsnd.h
ASoC: rsnd: enable multi Component support for Audio Graph Card/Card2
[linux.git] / sound / soc / sh / rcar / rsnd.h
CommitLineData
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 48enum 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 257struct rsnd_priv;
cdaa3cdf 258struct rsnd_mod;
1536a968
KM
259struct rsnd_dai;
260struct rsnd_dai_stream;
261
3337744a
KM
262/*
263 * R-Car basic functions
264 */
b7169dde
KM
265u32 rsnd_mod_read(struct rsnd_mod *mod, enum rsnd_reg reg);
266void rsnd_mod_write(struct rsnd_mod *mod, enum rsnd_reg reg, u32 data);
267void rsnd_mod_bset(struct rsnd_mod *mod, enum rsnd_reg reg, u32 mask, u32 data);
3023b384 268u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
4689032b 269u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
90431eb4 270u32 rsnd_get_busif_shift(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
3337744a 271
0a4d94c0
KM
272/*
273 * R-Car DMA
274 */
355cb84f 275int rsnd_dma_attach(struct rsnd_dai_stream *io,
b99305d2 276 struct rsnd_mod *mod, struct rsnd_mod **dma_mod);
2ea6b074 277int rsnd_dma_probe(struct rsnd_priv *priv);
039f2ccc
KM
278struct 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 284enum 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
301struct 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 361struct rsnd_dai_stream;
cdaa3cdf
KM
362struct 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
431int 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 437void rsnd_mod_quit(struct rsnd_mod *mod);
9b99e9a7
KM
438struct dma_chan *rsnd_mod_dma_req(struct rsnd_dai_stream *io,
439 struct rsnd_mod *mod);
f501b7a4
KM
440void rsnd_mod_interrupt(struct rsnd_mod *mod,
441 void (*callback)(struct rsnd_mod *mod,
442 struct rsnd_dai_stream *io));
7e7fe06d
KM
443u32 *rsnd_mod_get_status(struct rsnd_mod *mod,
444 struct rsnd_dai_stream *io,
5ba17b42 445 enum rsnd_mod_type type);
c16015f3
KM
446int rsnd_mod_id(struct rsnd_mod *mod);
447int rsnd_mod_id_raw(struct rsnd_mod *mod);
448int rsnd_mod_id_sub(struct rsnd_mod *mod);
c0ea089d 449char *rsnd_mod_name(struct rsnd_mod *mod);
b3ca3fbe
KM
450struct 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 463void 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 468int rsnd_node_count(struct rsnd_priv *priv, struct device_node *node, char *name);
d09a7db4 469int rsnd_node_fixed_index(struct device *dev, struct device_node *node, char *name, int idx);
cdaa3cdf 470
66287def 471int rsnd_channel_normalization(int chan);
b2fb31bb
KM
472#define rsnd_runtime_channel_original(io) \
473 rsnd_runtime_channel_original_with_params(io, NULL)
474int 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)
478int 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)
482int rsnd_runtime_channel_for_ssi_with_params(struct rsnd_dai_stream *io,
483 struct snd_pcm_hw_params *params);
a6072802
KM
484int rsnd_runtime_is_multi_ssi(struct rsnd_dai_stream *io);
485int rsnd_runtime_is_tdm(struct rsnd_dai_stream *io);
f69f4522 486int 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
505struct 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 540int rsnd_io_is_working(struct rsnd_dai_stream *io);
985a4f6e 541
1536a968
KM
542struct 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
570struct 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)
576int 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)
583int 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)
590int rsnd_rdai_width_ctrl(struct rsnd_dai *rdai, int width);
75defee0 591void rsnd_dai_period_elapsed(struct rsnd_dai_stream *io);
27924f32
KM
592int 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 599int rsnd_gen_probe(struct rsnd_priv *priv);
3337744a
KM
600void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
601 struct rsnd_mod *mod,
602 enum rsnd_reg reg);
c5212b45 603phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
1f9c82b5
KM
604#ifdef CONFIG_DEBUG_FS
605void __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 611int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate);
d29a6060
PLB
612int rsnd_adg_ssi_clk_stop(struct rsnd_mod *ssi_mod);
613int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate);
2ea6b074
KM
614int rsnd_adg_probe(struct rsnd_priv *priv);
615void rsnd_adg_remove(struct rsnd_priv *priv);
0102eed5 616int 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 620int 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)
624void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
1f9c82b5 625void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m);
dfc9403b 626
1536a968
KM
627/*
628 * R-Car sound priv
629 */
630struct 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 */
729struct 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
743struct rsnd_kctrl_cfg_m {
744 struct rsnd_kctrl_cfg cfg;
d2240f0d 745 u32 val[RSND_MAX_CHANNELS];
170a2497
KM
746};
747
748struct 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
757int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
758int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
32973dcf
KM
759struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
760struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
761int 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
785extern 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
792int rsnd_ssi_probe(struct rsnd_priv *priv);
793void rsnd_ssi_remove(struct rsnd_priv *priv);
78edead4 794struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
b415b4d3 795int rsnd_ssi_use_busif(struct rsnd_dai_stream *io);
25b384b8 796u32 rsnd_ssi_multi_secondaries_runtime(struct rsnd_dai_stream *io);
ab62e8a8 797int 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))
801int __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
804void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
805 struct device_node *playback,
806 struct device_node *capture);
fb2815f4 807unsigned 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 */
813int rsnd_ssiu_attach(struct rsnd_dai_stream *io,
814 struct rsnd_mod *mod);
2ea6b074
KM
815int rsnd_ssiu_probe(struct rsnd_priv *priv);
816void rsnd_ssiu_remove(struct rsnd_priv *priv);
4e7788fb
KM
817void 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 821bool rsnd_ssiu_busif_err_status_clear(struct rsnd_mod *mod);
c7f69ab5 822
07539c1d 823/*
ba9c949f 824 * R-Car SRC
07539c1d 825 */
2ea6b074
KM
826int rsnd_src_probe(struct rsnd_priv *priv);
827void rsnd_src_remove(struct rsnd_priv *priv);
ba9c949f 828struct 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)
832unsigned 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
845int rsnd_ctu_probe(struct rsnd_priv *priv);
846void rsnd_ctu_remove(struct rsnd_priv *priv);
9269e3c3 847struct 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
857int rsnd_mix_probe(struct rsnd_priv *priv);
858void rsnd_mix_remove(struct rsnd_priv *priv);
70fb1052 859struct 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
869int rsnd_dvc_probe(struct rsnd_priv *priv);
870void rsnd_dvc_remove(struct rsnd_priv *priv);
bff58ea4 871struct 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
881int rsnd_cmd_probe(struct rsnd_priv *priv);
882void rsnd_cmd_remove(struct rsnd_priv *priv);
1b2ca0ad 883int rsnd_cmd_attach(struct rsnd_dai_stream *io, int id);
1b2ca0ad 884
f1df1229 885void 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
908int rsnd_debugfs_probe(struct snd_soc_component *component);
909void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
910 void __iomem *base, int offset, int size);
911void 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 */
This page took 0.627634 seconds and 4 git commands to generate.