1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/sound/renesas,rsnd.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Renesas R-Car Sound Driver Device Tree Bindings
8
9maintainers:
10  - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
11
12properties:
13
14  compatible:
15    oneOf:
16      # for Gen1 SoC
17      - items:
18          - enum:
19              - renesas,rcar_sound-r8a7778   # R-Car M1A
20              - renesas,rcar_sound-r8a7779   # R-Car H1
21          - enum:
22              - renesas,rcar_sound-gen1
23      # for Gen2 SoC
24      - items:
25          - enum:
26              - renesas,rcar_sound-r8a7742   # RZ/G1H
27              - renesas,rcar_sound-r8a7743   # RZ/G1M
28              - renesas,rcar_sound-r8a7744   # RZ/G1N
29              - renesas,rcar_sound-r8a7745   # RZ/G1E
30              - renesas,rcar_sound-r8a77470  # RZ/G1C
31              - renesas,rcar_sound-r8a7790   # R-Car H2
32              - renesas,rcar_sound-r8a7791   # R-Car M2-W
33              - renesas,rcar_sound-r8a7793   # R-Car M2-N
34              - renesas,rcar_sound-r8a7794   # R-Car E2
35          - enum:
36              - renesas,rcar_sound-gen2
37      # for Gen3 SoC
38      - items:
39          - enum:
40              - renesas,rcar_sound-r8a774a1  # RZ/G2M
41              - renesas,rcar_sound-r8a774b1  # RZ/G2N
42              - renesas,rcar_sound-r8a774c0  # RZ/G2E
43              - renesas,rcar_sound-r8a774e1  # RZ/G2H
44              - renesas,rcar_sound-r8a7795   # R-Car H3
45              - renesas,rcar_sound-r8a7796   # R-Car M3-W
46              - renesas,rcar_sound-r8a77961  # R-Car M3-W+
47              - renesas,rcar_sound-r8a77965  # R-Car M3-N
48              - renesas,rcar_sound-r8a77990  # R-Car E3
49              - renesas,rcar_sound-r8a77995  # R-Car D3
50          - enum:
51              - renesas,rcar_sound-gen3
52      # for Generic
53      - items:
54          - enum:
55              - renesas,rcar_sound-gen1
56              - renesas,rcar_sound-gen2
57              - renesas,rcar_sound-gen3
58
59  reg:
60    minItems: 1
61    maxItems: 5
62
63  reg-names:
64    minItems: 1
65    maxItems: 5
66
67  "#sound-dai-cells":
68    description: |
69      it must be 0 if your system is using single DAI
70      it must be 1 if your system is using multi  DAIs
71    enum: [0, 1]
72
73  "#clock-cells":
74    description: |
75      it must be 0 if your system has audio_clkout
76      it must be 1 if your system has audio_clkout0/1/2/3
77    enum: [0, 1]
78
79  clock-frequency:
80    description: for audio_clkout0/1/2/3
81
82  clkout-lr-asynchronous:
83    description: audio_clkoutn is asynchronizes with lr-clock.
84    $ref: /schemas/types.yaml#/definitions/flag
85
86  power-domains: true
87
88  resets:
89    maxItems: 11
90
91  reset-names:
92    maxItems: 11
93
94  clocks:
95    description: References to SSI/SRC/MIX/CTU/DVC/AUDIO_CLK clocks.
96    minItems: 1
97    maxItems: 31
98
99  clock-names:
100    description: List of necessary clock names.
101    minItems: 1
102    maxItems: 31
103    items:
104      oneOf:
105        - const: ssi-all
106        - pattern: '^ssi\.[0-9]$'
107        - pattern: '^src\.[0-9]$'
108        - pattern: '^mix\.[0-1]$'
109        - pattern: '^ctu\.[0-1]$'
110        - pattern: '^dvc\.[0-1]$'
111        - pattern: '^clk_(a|b|c|i)$'
112
113  port: true
114
115# use patternProperties to avoid naming "xxx,yyy" issue
116patternProperties:
117  "^rcar_sound,dvc$":
118    description: DVC subnode.
119    type: object
120    patternProperties:
121      "^dvc-[0-1]$":
122        type: object
123        properties:
124          dmas:
125            maxItems: 1
126          dma-names:
127            const: "tx"
128        required:
129          - dmas
130          - dma-names
131    additionalProperties: false
132
133  "^rcar_sound,mix$":
134    description: MIX subnode.
135    type: object
136    patternProperties:
137      "^mix-[0-1]$":
138        type: object
139        # no properties
140    additionalProperties: false
141
142  "^rcar_sound,ctu$":
143    description: CTU subnode.
144    type: object
145    patternProperties:
146      "^ctu-[0-7]$":
147        type: object
148        # no properties
149    additionalProperties: false
150
151  "^rcar_sound,src$":
152    description: SRC subnode.
153    type: object
154    patternProperties:
155      "^src-[0-9]$":
156        type: object
157        properties:
158          interrupts:
159            maxItems: 1
160          dmas:
161            maxItems: 2
162          dma-names:
163            allOf:
164              - items:
165                  enum:
166                    - tx
167                    - rx
168        required:
169          - interrupts
170          - dmas
171          - dma-names
172    additionalProperties: false
173
174  "^rcar_sound,ssiu$":
175    description: SSIU subnode.
176    type: object
177    patternProperties:
178      "^ssiu-[0-9]+$":
179        type: object
180        properties:
181          dmas:
182            maxItems: 2
183          dma-names:
184            allOf:
185              - items:
186                  enum:
187                    - tx
188                    - rx
189        required:
190          - dmas
191          - dma-names
192    additionalProperties: false
193
194  "^rcar_sound,ssi$":
195    description: SSI subnode.
196    type: object
197    patternProperties:
198      "^ssi-[0-9]$":
199        type: object
200        properties:
201          interrupts:
202            maxItems: 1
203          dmas:
204            minItems: 2
205            maxItems: 4
206          dma-names:
207            allOf:
208              - items:
209                  enum:
210                    - tx
211                    - rx
212                    - txu # if no ssiu node
213                    - rxu # if no ssiu node
214
215          shared-pin:
216            description: shared clock pin
217            $ref: /schemas/types.yaml#/definitions/flag
218          pio-transfer:
219            description: PIO transfer mode
220            $ref: /schemas/types.yaml#/definitions/flag
221          no-busif:
222            description: BUSIF is not used when [mem -> SSI] via DMA case
223            $ref: /schemas/types.yaml#/definitions/flag
224        required:
225          - interrupts
226          - dmas
227          - dma-names
228    additionalProperties: false
229
230  # For DAI base
231  "^rcar_sound,dai$":
232    description: DAI subnode.
233    type: object
234    patternProperties:
235      "^dai([0-9]+)?$":
236        type: object
237        properties:
238          playback:
239            $ref: /schemas/types.yaml#/definitions/phandle-array
240          capture:
241            $ref: /schemas/types.yaml#/definitions/phandle-array
242        anyOf:
243          - required:
244              - playback
245          - required:
246              - capture
247    additionalProperties: false
248
249required:
250  - compatible
251  - reg
252  - reg-names
253  - clocks
254  - clock-names
255  - "#sound-dai-cells"
256
257allOf:
258  - $ref: audio-graph.yaml#
259  - $ref: audio-graph-port.yaml#
260  - if:
261      properties:
262        compatible:
263          contains:
264            const: renesas,rcar_sound-gen1
265    then:
266      properties:
267        reg:
268          maxItems: 3
269        reg-names:
270          maxItems: 3
271          items:
272            enum:
273              - scu
274              - ssi
275              - adg
276    else:
277      properties:
278        reg:
279          maxItems: 5
280        reg-names:
281          maxItems: 5
282          items:
283            enum:
284              - scu
285              - adg
286              - ssiu
287              - ssi
288              - audmapp
289
290additionalProperties: false
291
292examples:
293  - |
294    rcar_sound: sound@ec500000 {
295        #sound-dai-cells = <1>;
296        compatible = "renesas,rcar_sound-r8a7790", "renesas,rcar_sound-gen2";
297        reg = <0xec500000 0x1000>, /* SCU  */
298              <0xec5a0000 0x100>,  /* ADG  */
299              <0xec540000 0x1000>, /* SSIU */
300              <0xec541000 0x1280>, /* SSI  */
301              <0xec740000 0x200>;  /* Audio DMAC peri peri*/
302        reg-names = "scu", "adg", "ssiu", "ssi", "audmapp";
303
304        clocks = <&mstp10_clks 1005>,                      /* SSI-ALL    */
305                 <&mstp10_clks 1006>, <&mstp10_clks 1007>, /* SSI9, SSI8 */
306                 <&mstp10_clks 1008>, <&mstp10_clks 1009>, /* SSI7, SSI6 */
307                 <&mstp10_clks 1010>, <&mstp10_clks 1011>, /* SSI5, SSI4 */
308                 <&mstp10_clks 1012>, <&mstp10_clks 1013>, /* SSI3, SSI2 */
309                 <&mstp10_clks 1014>, <&mstp10_clks 1015>, /* SSI1, SSI0 */
310                 <&mstp10_clks 1022>, <&mstp10_clks 1023>, /* SRC9, SRC8 */
311                 <&mstp10_clks 1024>, <&mstp10_clks 1025>, /* SRC7, SRC6 */
312                 <&mstp10_clks 1026>, <&mstp10_clks 1027>, /* SRC5, SRC4 */
313                 <&mstp10_clks 1028>, <&mstp10_clks 1029>, /* SRC3, SRC2 */
314                 <&mstp10_clks 1030>, <&mstp10_clks 1031>, /* SRC1, SRC0 */
315                 <&mstp10_clks 1020>, <&mstp10_clks 1021>, /* MIX1, MIX0 */
316                 <&mstp10_clks 1020>, <&mstp10_clks 1021>, /* CTU1, CTU0 */
317                 <&mstp10_clks 1019>, <&mstp10_clks 1018>, /* DVC0, DVC1 */
318                 <&audio_clk_a>, <&audio_clk_b>,           /* CLKA, CLKB */
319                 <&audio_clk_c>, <&audio_clk_i>;           /* CLKC, CLKI */
320
321        clock-names = "ssi-all",
322                      "ssi.9", "ssi.8",
323                      "ssi.7", "ssi.6",
324                      "ssi.5", "ssi.4",
325                      "ssi.3", "ssi.2",
326                      "ssi.1", "ssi.0",
327                      "src.9", "src.8",
328                      "src.7", "src.6",
329                      "src.5", "src.4",
330                      "src.3", "src.2",
331                      "src.1", "src.0",
332                      "mix.1", "mix.0",
333                      "ctu.1", "ctu.0",
334                      "dvc.0", "dvc.1",
335                      "clk_a", "clk_b",
336                      "clk_c", "clk_i";
337
338        rcar_sound,dvc {
339               dvc0: dvc-0 {
340                    dmas = <&audma0 0xbc>;
341                    dma-names = "tx";
342               };
343               dvc1: dvc-1 {
344                    dmas = <&audma0 0xbe>;
345                    dma-names = "tx";
346               };
347        };
348
349        rcar_sound,mix {
350            mix0: mix-0 { };
351            mix1: mix-1 { };
352        };
353
354        rcar_sound,ctu {
355            ctu00: ctu-0 { };
356            ctu01: ctu-1 { };
357            ctu02: ctu-2 { };
358            ctu03: ctu-3 { };
359            ctu10: ctu-4 { };
360            ctu11: ctu-5 { };
361            ctu12: ctu-6 { };
362            ctu13: ctu-7 { };
363        };
364
365        rcar_sound,src {
366            src0: src-0 {
367                status = "disabled";
368            };
369            src1: src-1 {
370                interrupts = <0 353 0>;
371                dmas = <&audma0 0x87>, <&audma1 0x9c>;
372                dma-names = "rx", "tx";
373            };
374            /* skip after src-2 */
375        };
376
377        rcar_sound,ssiu {
378            ssiu00: ssiu-0 {
379                dmas = <&audma0 0x15>, <&audma1 0x16>;
380                dma-names = "rx", "tx";
381            };
382            ssiu01: ssiu-1 {
383                dmas = <&audma0 0x35>, <&audma1 0x36>;
384                dma-names = "rx", "tx";
385            };
386            /* skip after ssiu-2 */
387        };
388
389        rcar_sound,ssi {
390            ssi0: ssi-0 {
391                interrupts = <0 370 1>;
392                dmas = <&audma0 0x01>, <&audma1 0x02>;
393                dma-names = "rx", "tx";
394            };
395            ssi1: ssi-1 {
396                interrupts = <0 371 1>;
397                dmas = <&audma0 0x03>, <&audma1 0x04>;
398                dma-names = "rx", "tx";
399            };
400            /* skip other ssi-2 */
401        };
402
403        /* DAI base */
404        rcar_sound,dai {
405            dai0 {
406                playback = <&ssi5>, <&src5>;
407                capture  = <&ssi6>;
408            };
409            dai1 {
410                playback = <&ssi3>;
411            };
412            dai2 {
413                capture  = <&ssi4>;
414            };
415            dai3 {
416                playback = <&ssi7>;
417            };
418            dai4 {
419                capture  = <&ssi8>;
420            };
421        };
422
423        /* assume audio-graph */
424        port {
425            rsnd_endpoint: endpoint {
426                remote-endpoint = <&codec_endpoint>;
427
428                dai-format = "left_j";
429                bitclock-master = <&rsnd_endpoint0>;
430                frame-master = <&rsnd_endpoint0>;
431
432                playback = <&ssi0>, <&src0>, <&dvc0>;
433                capture  = <&ssi1>, <&src1>, <&dvc1>;
434            };
435        };
436    };
437
438
439    /* assume audio-graph */
440    codec {
441        port {
442            codec_endpoint: endpoint {
443                remote-endpoint = <&rsnd_endpoint>;
444            };
445        };
446    };
447