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    $ref: /schemas/types.yaml#/definitions/uint32-array
82
83  clkout-lr-asynchronous:
84    description: audio_clkoutn is asynchronizes with lr-clock.
85    $ref: /schemas/types.yaml#/definitions/flag
86
87  power-domains: true
88
89  resets:
90    maxItems: 11
91
92  reset-names:
93    maxItems: 11
94
95  clocks:
96    description: References to SSI/SRC/MIX/CTU/DVC/AUDIO_CLK clocks.
97    minItems: 1
98    maxItems: 31
99
100  clock-names:
101    description: List of necessary clock names.
102    minItems: 1
103    maxItems: 31
104    items:
105      oneOf:
106        - const: ssi-all
107        - pattern: '^ssi\.[0-9]$'
108        - pattern: '^src\.[0-9]$'
109        - pattern: '^mix\.[0-1]$'
110        - pattern: '^ctu\.[0-1]$'
111        - pattern: '^dvc\.[0-1]$'
112        - pattern: '^clk_(a|b|c|i)$'
113
114  port: true
115
116# use patternProperties to avoid naming "xxx,yyy" issue
117patternProperties:
118  "^rcar_sound,dvc$":
119    description: DVC subnode.
120    type: object
121    patternProperties:
122      "^dvc-[0-1]$":
123        type: object
124        properties:
125          dmas:
126            maxItems: 1
127          dma-names:
128            const: "tx"
129        required:
130          - dmas
131          - dma-names
132    additionalProperties: false
133
134  "^rcar_sound,mix$":
135    description: MIX subnode.
136    type: object
137    patternProperties:
138      "^mix-[0-1]$":
139        type: object
140        # no properties
141    additionalProperties: false
142
143  "^rcar_sound,ctu$":
144    description: CTU subnode.
145    type: object
146    patternProperties:
147      "^ctu-[0-7]$":
148        type: object
149        # no properties
150    additionalProperties: false
151
152  "^rcar_sound,src$":
153    description: SRC subnode.
154    type: object
155    patternProperties:
156      "^src-[0-9]$":
157        type: object
158        properties:
159          interrupts:
160            maxItems: 1
161          dmas:
162            maxItems: 2
163          dma-names:
164            allOf:
165              - items:
166                  enum:
167                    - tx
168                    - rx
169        required:
170          - interrupts
171          - dmas
172          - dma-names
173    additionalProperties: false
174
175  "^rcar_sound,ssiu$":
176    description: SSIU subnode.
177    type: object
178    patternProperties:
179      "^ssiu-[0-9]+$":
180        type: object
181        properties:
182          dmas:
183            maxItems: 2
184          dma-names:
185            allOf:
186              - items:
187                  enum:
188                    - tx
189                    - rx
190        required:
191          - dmas
192          - dma-names
193    additionalProperties: false
194
195  "^rcar_sound,ssi$":
196    description: SSI subnode.
197    type: object
198    patternProperties:
199      "^ssi-[0-9]$":
200        type: object
201        properties:
202          interrupts:
203            maxItems: 1
204          dmas:
205            minItems: 2
206            maxItems: 4
207          dma-names:
208            allOf:
209              - items:
210                  enum:
211                    - tx
212                    - rx
213                    - txu # if no ssiu node
214                    - rxu # if no ssiu node
215
216          shared-pin:
217            description: shared clock pin
218            $ref: /schemas/types.yaml#/definitions/flag
219          pio-transfer:
220            description: PIO transfer mode
221            $ref: /schemas/types.yaml#/definitions/flag
222          no-busif:
223            description: BUSIF is not used when [mem -> SSI] via DMA case
224            $ref: /schemas/types.yaml#/definitions/flag
225        required:
226          - interrupts
227          - dmas
228          - dma-names
229    additionalProperties: false
230
231  # For DAI base
232  "^rcar_sound,dai$":
233    description: DAI subnode.
234    type: object
235    patternProperties:
236      "^dai([0-9]+)?$":
237        type: object
238        properties:
239          playback:
240            $ref: /schemas/types.yaml#/definitions/phandle-array
241          capture:
242            $ref: /schemas/types.yaml#/definitions/phandle-array
243        anyOf:
244          - required:
245              - playback
246          - required:
247              - capture
248    additionalProperties: false
249
250required:
251  - compatible
252  - reg
253  - reg-names
254  - clocks
255  - clock-names
256  - "#sound-dai-cells"
257
258allOf:
259  - $ref: audio-graph.yaml#
260  - $ref: audio-graph-port.yaml#
261  - if:
262      properties:
263        compatible:
264          contains:
265            const: renesas,rcar_sound-gen1
266    then:
267      properties:
268        reg:
269          maxItems: 3
270        reg-names:
271          maxItems: 3
272          items:
273            enum:
274              - scu
275              - ssi
276              - adg
277    else:
278      properties:
279        reg:
280          maxItems: 5
281        reg-names:
282          maxItems: 5
283          items:
284            enum:
285              - scu
286              - adg
287              - ssiu
288              - ssi
289              - audmapp
290
291additionalProperties: false
292
293examples:
294  - |
295    rcar_sound: sound@ec500000 {
296        #sound-dai-cells = <1>;
297        compatible = "renesas,rcar_sound-r8a7790", "renesas,rcar_sound-gen2";
298        reg = <0xec500000 0x1000>, /* SCU  */
299              <0xec5a0000 0x100>,  /* ADG  */
300              <0xec540000 0x1000>, /* SSIU */
301              <0xec541000 0x1280>, /* SSI  */
302              <0xec740000 0x200>;  /* Audio DMAC peri peri*/
303        reg-names = "scu", "adg", "ssiu", "ssi", "audmapp";
304
305        clocks = <&mstp10_clks 1005>,                      /* SSI-ALL    */
306                 <&mstp10_clks 1006>, <&mstp10_clks 1007>, /* SSI9, SSI8 */
307                 <&mstp10_clks 1008>, <&mstp10_clks 1009>, /* SSI7, SSI6 */
308                 <&mstp10_clks 1010>, <&mstp10_clks 1011>, /* SSI5, SSI4 */
309                 <&mstp10_clks 1012>, <&mstp10_clks 1013>, /* SSI3, SSI2 */
310                 <&mstp10_clks 1014>, <&mstp10_clks 1015>, /* SSI1, SSI0 */
311                 <&mstp10_clks 1022>, <&mstp10_clks 1023>, /* SRC9, SRC8 */
312                 <&mstp10_clks 1024>, <&mstp10_clks 1025>, /* SRC7, SRC6 */
313                 <&mstp10_clks 1026>, <&mstp10_clks 1027>, /* SRC5, SRC4 */
314                 <&mstp10_clks 1028>, <&mstp10_clks 1029>, /* SRC3, SRC2 */
315                 <&mstp10_clks 1030>, <&mstp10_clks 1031>, /* SRC1, SRC0 */
316                 <&mstp10_clks 1020>, <&mstp10_clks 1021>, /* MIX1, MIX0 */
317                 <&mstp10_clks 1020>, <&mstp10_clks 1021>, /* CTU1, CTU0 */
318                 <&mstp10_clks 1019>, <&mstp10_clks 1018>, /* DVC0, DVC1 */
319                 <&audio_clk_a>, <&audio_clk_b>,           /* CLKA, CLKB */
320                 <&audio_clk_c>, <&audio_clk_i>;           /* CLKC, CLKI */
321
322        clock-names = "ssi-all",
323                      "ssi.9", "ssi.8",
324                      "ssi.7", "ssi.6",
325                      "ssi.5", "ssi.4",
326                      "ssi.3", "ssi.2",
327                      "ssi.1", "ssi.0",
328                      "src.9", "src.8",
329                      "src.7", "src.6",
330                      "src.5", "src.4",
331                      "src.3", "src.2",
332                      "src.1", "src.0",
333                      "mix.1", "mix.0",
334                      "ctu.1", "ctu.0",
335                      "dvc.0", "dvc.1",
336                      "clk_a", "clk_b",
337                      "clk_c", "clk_i";
338
339        rcar_sound,dvc {
340               dvc0: dvc-0 {
341                    dmas = <&audma0 0xbc>;
342                    dma-names = "tx";
343               };
344               dvc1: dvc-1 {
345                    dmas = <&audma0 0xbe>;
346                    dma-names = "tx";
347               };
348        };
349
350        rcar_sound,mix {
351            mix0: mix-0 { };
352            mix1: mix-1 { };
353        };
354
355        rcar_sound,ctu {
356            ctu00: ctu-0 { };
357            ctu01: ctu-1 { };
358            ctu02: ctu-2 { };
359            ctu03: ctu-3 { };
360            ctu10: ctu-4 { };
361            ctu11: ctu-5 { };
362            ctu12: ctu-6 { };
363            ctu13: ctu-7 { };
364        };
365
366        rcar_sound,src {
367            src0: src-0 {
368                status = "disabled";
369            };
370            src1: src-1 {
371                interrupts = <0 353 0>;
372                dmas = <&audma0 0x87>, <&audma1 0x9c>;
373                dma-names = "rx", "tx";
374            };
375            /* skip after src-2 */
376        };
377
378        rcar_sound,ssiu {
379            ssiu00: ssiu-0 {
380                dmas = <&audma0 0x15>, <&audma1 0x16>;
381                dma-names = "rx", "tx";
382            };
383            ssiu01: ssiu-1 {
384                dmas = <&audma0 0x35>, <&audma1 0x36>;
385                dma-names = "rx", "tx";
386            };
387            /* skip after ssiu-2 */
388        };
389
390        rcar_sound,ssi {
391            ssi0: ssi-0 {
392                interrupts = <0 370 1>;
393                dmas = <&audma0 0x01>, <&audma1 0x02>;
394                dma-names = "rx", "tx";
395            };
396            ssi1: ssi-1 {
397                interrupts = <0 371 1>;
398                dmas = <&audma0 0x03>, <&audma1 0x04>;
399                dma-names = "rx", "tx";
400            };
401            /* skip other ssi-2 */
402        };
403
404        /* DAI base */
405        rcar_sound,dai {
406            dai0 {
407                playback = <&ssi5>, <&src5>;
408                capture  = <&ssi6>;
409            };
410            dai1 {
411                playback = <&ssi3>;
412            };
413            dai2 {
414                capture  = <&ssi4>;
415            };
416            dai3 {
417                playback = <&ssi7>;
418            };
419            dai4 {
420                capture  = <&ssi8>;
421            };
422        };
423
424        /* assume audio-graph */
425        port {
426            rsnd_endpoint: endpoint {
427                remote-endpoint = <&codec_endpoint>;
428
429                dai-format = "left_j";
430                bitclock-master = <&rsnd_endpoint0>;
431                frame-master = <&rsnd_endpoint0>;
432
433                playback = <&ssi0>, <&src0>, <&dvc0>;
434                capture  = <&ssi1>, <&src1>, <&dvc1>;
435            };
436        };
437    };
438
439
440    /* assume audio-graph */
441    codec {
442        port {
443            codec_endpoint: endpoint {
444                remote-endpoint = <&rsnd_endpoint>;
445            };
446        };
447    };
448