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