Tom Rini | 53633a8 | 2024-02-29 12:33:36 -0500 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | %YAML 1.2 |
| 3 | --- |
| 4 | $id: http://devicetree.org/schemas/sound/simple-card.yaml# |
| 5 | $schema: http://devicetree.org/meta-schemas/core.yaml# |
| 6 | |
| 7 | title: Simple Audio Card Driver |
| 8 | |
| 9 | maintainers: |
| 10 | - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| 11 | |
| 12 | definitions: |
| 13 | |
| 14 | frame-master: |
| 15 | description: Indicates dai-link frame master. |
| 16 | $ref: /schemas/types.yaml#/definitions/phandle |
| 17 | |
| 18 | bitclock-master: |
| 19 | description: Indicates dai-link bit clock master |
| 20 | $ref: /schemas/types.yaml#/definitions/phandle |
| 21 | |
| 22 | frame-inversion: |
| 23 | description: dai-link uses frame clock inversion |
| 24 | $ref: /schemas/types.yaml#/definitions/flag |
| 25 | |
| 26 | bitclock-inversion: |
| 27 | description: dai-link uses bit clock inversion |
| 28 | $ref: /schemas/types.yaml#/definitions/flag |
| 29 | |
| 30 | dai-tdm-slot-num: |
| 31 | description: see tdm-slot.txt. |
| 32 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 33 | |
| 34 | dai-tdm-slot-width: |
| 35 | description: see tdm-slot.txt. |
| 36 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 37 | |
| 38 | system-clock-frequency: |
| 39 | description: | |
| 40 | If a clock is specified and a multiplication factor is given with |
| 41 | mclk-fs, the clock will be set to the calculated mclk frequency |
| 42 | when the stream starts. |
| 43 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 44 | |
| 45 | system-clock-direction-out: |
| 46 | description: | |
| 47 | specifies clock direction as 'out' on initialization. |
| 48 | It is useful for some aCPUs with fixed clocks. |
| 49 | $ref: /schemas/types.yaml#/definitions/flag |
| 50 | |
| 51 | system-clock-fixed: |
| 52 | description: | |
| 53 | Specifies that the clock frequency should not be modified. |
| 54 | Implied when system-clock-frequency is specified, but can be used when |
| 55 | a clock is mapped to the device whose frequency cannot or should not be |
| 56 | changed. When mclk-fs is also specified, this restricts the device to a |
| 57 | single fixed sampling rate. |
| 58 | $ref: /schemas/types.yaml#/definitions/flag |
| 59 | |
| 60 | mclk-fs: |
| 61 | description: | |
| 62 | Multiplication factor between stream rate and codec mclk. |
| 63 | When defined, mclk-fs property defined in dai-link sub nodes are ignored. |
| 64 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 65 | |
| 66 | aux-devs: |
| 67 | description: | |
| 68 | List of phandles pointing to auxiliary devices, such |
| 69 | as amplifiers, to be added to the sound card. |
| 70 | $ref: /schemas/types.yaml#/definitions/phandle-array |
| 71 | |
| 72 | convert-rate: |
| 73 | description: CPU to Codec rate convert. |
| 74 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 75 | |
| 76 | convert-channels: |
| 77 | description: CPU to Codec rate channels. |
| 78 | $ref: /schemas/types.yaml#/definitions/uint32 |
| 79 | |
| 80 | prefix: |
| 81 | description: device name prefix |
| 82 | $ref: /schemas/types.yaml#/definitions/string |
| 83 | |
| 84 | label: |
| 85 | maxItems: 1 |
| 86 | |
| 87 | routing: |
| 88 | description: | |
| 89 | A list of the connections between audio components. |
| 90 | Each entry is a pair of strings, the first being the |
| 91 | connection's sink, the second being the connection's source. |
| 92 | $ref: /schemas/types.yaml#/definitions/non-unique-string-array |
| 93 | |
| 94 | widgets: |
| 95 | description: User specified audio sound widgets. |
| 96 | $ref: /schemas/types.yaml#/definitions/non-unique-string-array |
| 97 | |
| 98 | pin-switches: |
| 99 | description: the widget names for which pin switches must be created. |
| 100 | $ref: /schemas/types.yaml#/definitions/string-array |
| 101 | |
| 102 | format: |
| 103 | description: audio format. |
| 104 | items: |
| 105 | enum: |
| 106 | - i2s |
| 107 | - right_j |
| 108 | - left_j |
| 109 | - dsp_a |
| 110 | - dsp_b |
| 111 | - ac97 |
| 112 | - pdm |
| 113 | - msb |
| 114 | - lsb |
| 115 | |
| 116 | dai: |
| 117 | type: object |
| 118 | properties: |
| 119 | sound-dai: |
| 120 | maxItems: 1 |
| 121 | |
| 122 | # common properties |
| 123 | mclk-fs: |
| 124 | $ref: "#/definitions/mclk-fs" |
| 125 | prefix: |
| 126 | $ref: "#/definitions/prefix" |
| 127 | frame-inversion: |
| 128 | $ref: "#/definitions/frame-inversion" |
| 129 | bitclock-inversion: |
| 130 | $ref: "#/definitions/bitclock-inversion" |
| 131 | frame-master: |
| 132 | $ref: /schemas/types.yaml#/definitions/flag |
| 133 | bitclock-master: |
| 134 | $ref: /schemas/types.yaml#/definitions/flag |
| 135 | |
| 136 | dai-tdm-slot-num: |
| 137 | $ref: "#/definitions/dai-tdm-slot-num" |
| 138 | dai-tdm-slot-width: |
| 139 | $ref: "#/definitions/dai-tdm-slot-width" |
| 140 | clocks: |
| 141 | maxItems: 1 |
| 142 | system-clock-frequency: |
| 143 | $ref: "#/definitions/system-clock-frequency" |
| 144 | system-clock-direction-out: |
| 145 | $ref: "#/definitions/system-clock-direction-out" |
| 146 | system-clock-fixed: |
| 147 | $ref: "#/definitions/system-clock-fixed" |
| 148 | required: |
| 149 | - sound-dai |
| 150 | |
| 151 | additional-devs: |
| 152 | type: object |
| 153 | description: |
| 154 | Additional devices used by the simple audio card. |
| 155 | patternProperties: |
| 156 | '^iio-aux(-.+)?$': |
| 157 | type: object |
| 158 | $ref: audio-iio-aux.yaml# |
| 159 | |
| 160 | properties: |
| 161 | compatible: |
| 162 | contains: |
| 163 | enum: |
| 164 | - simple-audio-card |
| 165 | - simple-scu-audio-card |
| 166 | |
| 167 | "#address-cells": |
| 168 | const: 1 |
| 169 | "#size-cells": |
| 170 | const: 0 |
| 171 | |
| 172 | label: |
| 173 | $ref: "#/definitions/label" |
| 174 | |
| 175 | simple-audio-card,name: |
| 176 | description: User specified audio sound card name. |
| 177 | $ref: /schemas/types.yaml#/definitions/string |
| 178 | |
| 179 | simple-audio-card,widgets: |
| 180 | $ref: "#/definitions/widgets" |
| 181 | simple-audio-card,routing: |
| 182 | $ref: "#/definitions/routing" |
| 183 | |
| 184 | # common properties |
| 185 | simple-audio-card,frame-master: |
| 186 | $ref: "#/definitions/frame-master" |
| 187 | simple-audio-card,bitclock-master: |
| 188 | $ref: "#/definitions/bitclock-master" |
| 189 | simple-audio-card,frame-inversion: |
| 190 | $ref: "#/definitions/frame-inversion" |
| 191 | simple-audio-card,bitclock-inversion: |
| 192 | $ref: "#/definitions/bitclock-inversion" |
| 193 | simple-audio-card,format: |
| 194 | $ref: "#/definitions/format" |
| 195 | simple-audio-card,mclk-fs: |
| 196 | $ref: "#/definitions/mclk-fs" |
| 197 | simple-audio-card,aux-devs: |
| 198 | $ref: "#/definitions/aux-devs" |
| 199 | simple-audio-card,additional-devs: |
| 200 | $ref: "#/definitions/additional-devs" |
| 201 | simple-audio-card,convert-rate: |
| 202 | $ref: "#/definitions/convert-rate" |
| 203 | simple-audio-card,convert-channels: |
| 204 | $ref: "#/definitions/convert-channels" |
| 205 | simple-audio-card,prefix: |
| 206 | $ref: "#/definitions/prefix" |
| 207 | simple-audio-card,pin-switches: |
| 208 | $ref: "#/definitions/pin-switches" |
| 209 | simple-audio-card,hp-det-gpio: |
| 210 | maxItems: 1 |
| 211 | simple-audio-card,mic-det-gpio: |
| 212 | maxItems: 1 |
| 213 | |
| 214 | patternProperties: |
| 215 | "^simple-audio-card,cpu(@[0-9a-f]+)?$": |
| 216 | $ref: "#/definitions/dai" |
| 217 | "^simple-audio-card,codec(@[0-9a-f]+)?$": |
| 218 | $ref: "#/definitions/dai" |
| 219 | "^simple-audio-card,plat(@[0-9a-f]+)?$": |
| 220 | $ref: "#/definitions/dai" |
| 221 | |
| 222 | "^simple-audio-card,dai-link(@[0-9a-f]+)?$": |
| 223 | description: | |
| 224 | Container for dai-link level properties and the CPU and CODEC sub-nodes. |
| 225 | This container may be omitted when the card has only one DAI link. |
| 226 | type: object |
| 227 | properties: |
| 228 | reg: |
| 229 | maxItems: 1 |
| 230 | |
| 231 | "#address-cells": |
| 232 | const: 1 |
| 233 | "#size-cells": |
| 234 | const: 0 |
| 235 | # common properties |
| 236 | frame-master: |
| 237 | $ref: "#/definitions/frame-master" |
| 238 | bitclock-master: |
| 239 | $ref: "#/definitions/bitclock-master" |
| 240 | frame-inversion: |
| 241 | $ref: "#/definitions/frame-inversion" |
| 242 | bitclock-inversion: |
| 243 | $ref: "#/definitions/bitclock-inversion" |
| 244 | format: |
| 245 | $ref: "#/definitions/format" |
| 246 | mclk-fs: |
| 247 | $ref: "#/definitions/mclk-fs" |
| 248 | aux-devs: |
| 249 | $ref: "#/definitions/aux-devs" |
| 250 | convert-rate: |
| 251 | $ref: "#/definitions/convert-rate" |
| 252 | convert-channels: |
| 253 | $ref: "#/definitions/convert-channels" |
| 254 | prefix: |
| 255 | $ref: "#/definitions/prefix" |
| 256 | pin-switches: |
| 257 | $ref: "#/definitions/pin-switches" |
| 258 | hp-det-gpio: |
| 259 | maxItems: 1 |
| 260 | mic-det-gpio: |
| 261 | maxItems: 1 |
| 262 | |
| 263 | patternProperties: |
| 264 | "^cpu(-[0-9]+)?$": |
| 265 | $ref: "#/definitions/dai" |
| 266 | "^codec(-[0-9]+)?$": |
| 267 | $ref: "#/definitions/dai" |
| 268 | additionalProperties: false |
| 269 | |
| 270 | required: |
| 271 | - compatible |
| 272 | |
| 273 | additionalProperties: false |
| 274 | |
| 275 | examples: |
| 276 | # -------------------- |
| 277 | # single DAI link |
| 278 | # -------------------- |
| 279 | - | |
| 280 | sound { |
| 281 | compatible = "simple-audio-card"; |
| 282 | simple-audio-card,name = "VF610-Tower-Sound-Card"; |
| 283 | simple-audio-card,format = "left_j"; |
| 284 | simple-audio-card,bitclock-master = <&dailink0_master>; |
| 285 | simple-audio-card,frame-master = <&dailink0_master>; |
| 286 | simple-audio-card,widgets = |
| 287 | "Microphone", "Microphone Jack", |
| 288 | "Headphone", "Headphone Jack", |
| 289 | "Speaker", "External Speaker"; |
| 290 | simple-audio-card,routing = |
| 291 | "MIC_IN", "Microphone Jack", |
| 292 | "Headphone Jack", "HP_OUT", |
| 293 | "External Speaker", "LINE_OUT"; |
| 294 | |
| 295 | simple-audio-card,cpu { |
| 296 | sound-dai = <&sh_fsi2 0>; |
| 297 | }; |
| 298 | |
| 299 | dailink0_master: simple-audio-card,codec { |
| 300 | sound-dai = <&ak4648>; |
| 301 | clocks = <&osc>; |
| 302 | }; |
| 303 | }; |
| 304 | |
| 305 | # -------------------- |
| 306 | # Multi DAI links |
| 307 | # -------------------- |
| 308 | - | |
| 309 | sound { |
| 310 | compatible = "simple-audio-card"; |
| 311 | simple-audio-card,name = "Cubox Audio"; |
| 312 | |
| 313 | #address-cells = <1>; |
| 314 | #size-cells = <0>; |
| 315 | |
| 316 | simple-audio-card,dai-link@0 { /* I2S - HDMI */ |
| 317 | reg = <0>; |
| 318 | format = "i2s"; |
| 319 | cpu { |
| 320 | sound-dai = <&audio0>; |
| 321 | }; |
| 322 | codec { |
| 323 | sound-dai = <&tda998x0>; |
| 324 | }; |
| 325 | }; |
| 326 | |
| 327 | simple-audio-card,dai-link@1 { /* S/PDIF - HDMI */ |
| 328 | reg = <1>; |
| 329 | cpu { |
| 330 | sound-dai = <&audio1>; |
| 331 | }; |
| 332 | codec { |
| 333 | sound-dai = <&tda998x1>; |
| 334 | }; |
| 335 | }; |
| 336 | |
| 337 | simple-audio-card,dai-link@2 { /* S/PDIF - S/PDIF */ |
| 338 | reg = <2>; |
| 339 | cpu { |
| 340 | sound-dai = <&audio2>; |
| 341 | }; |
| 342 | codec { |
| 343 | sound-dai = <&spdif_codec>; |
| 344 | }; |
| 345 | }; |
| 346 | }; |
| 347 | |
| 348 | # -------------------- |
| 349 | # route audio from IMX6 SSI2 through TLV320DAC3100 codec |
| 350 | # through TPA6130A2 amplifier to headphones: |
| 351 | # -------------------- |
| 352 | - | |
| 353 | sound { |
| 354 | compatible = "simple-audio-card"; |
| 355 | |
| 356 | simple-audio-card,widgets = |
| 357 | "Headphone", "Headphone Jack"; |
| 358 | simple-audio-card,routing = |
| 359 | "Headphone Jack", "HPLEFT", |
| 360 | "Headphone Jack", "HPRIGHT", |
| 361 | "LEFTIN", "HPL", |
| 362 | "RIGHTIN", "HPR"; |
| 363 | simple-audio-card,aux-devs = <&>; |
| 364 | simple-audio-card,cpu { |
| 365 | sound-dai = <&ssi2>; |
| 366 | }; |
| 367 | simple-audio-card,codec { |
| 368 | sound-dai = <&codec>; |
| 369 | clocks = <&clocks>; |
| 370 | }; |
| 371 | }; |
| 372 | |
| 373 | # -------------------- |
| 374 | # route audio to/from a codec through an amplifier |
| 375 | # designed with a potentiometer driven by IIO: |
| 376 | # -------------------- |
| 377 | - | |
| 378 | sound { |
| 379 | compatible = "simple-audio-card"; |
| 380 | |
| 381 | simple-audio-card,aux-devs = <&_in>, <&_out>; |
| 382 | simple-audio-card,routing = |
| 383 | "CODEC LEFTIN", "AMP_IN LEFT OUT", |
| 384 | "CODEC RIGHTIN", "AMP_IN RIGHT OUT", |
| 385 | "AMP_OUT LEFT IN", "CODEC LEFTOUT", |
| 386 | "AMP_OUT RIGHT IN", "CODEC RIGHTOUT"; |
| 387 | |
| 388 | simple-audio-card,additional-devs { |
| 389 | amp_out: iio-aux-out { |
| 390 | compatible = "audio-iio-aux"; |
| 391 | io-channels = <&pot_out 0>, <&pot_out 1>; |
| 392 | io-channel-names = "LEFT", "RIGHT"; |
| 393 | snd-control-invert-range = <1 1>; |
| 394 | sound-name-prefix = "AMP_OUT"; |
| 395 | }; |
| 396 | |
| 397 | amp_in: iio_aux-in { |
| 398 | compatible = "audio-iio-aux"; |
| 399 | io-channels = <&pot_in 0>, <&pot_in 1>; |
| 400 | io-channel-names = "LEFT", "RIGHT"; |
| 401 | sound-name-prefix = "AMP_IN"; |
| 402 | }; |
| 403 | }; |
| 404 | |
| 405 | simple-audio-card,cpu { |
| 406 | sound-dai = <&cpu>; |
| 407 | }; |
| 408 | |
| 409 | simple-audio-card,codec { |
| 410 | sound-dai = <&codec>; |
| 411 | clocks = <&clocks>; |
| 412 | }; |
| 413 | }; |
| 414 | |
| 415 | # -------------------- |
| 416 | # Sampling Rate Conversion |
| 417 | # -------------------- |
| 418 | - | |
| 419 | sound { |
| 420 | compatible = "simple-audio-card"; |
| 421 | |
| 422 | simple-audio-card,name = "rsnd-ak4643"; |
| 423 | simple-audio-card,format = "left_j"; |
| 424 | simple-audio-card,bitclock-master = <&sndcodec>; |
| 425 | simple-audio-card,frame-master = <&sndcodec>; |
| 426 | |
| 427 | simple-audio-card,convert-rate = <48000>; |
| 428 | |
| 429 | simple-audio-card,prefix = "ak4642"; |
| 430 | simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback", |
| 431 | "DAI0 Capture", "ak4642 Capture"; |
| 432 | |
| 433 | sndcpu: simple-audio-card,cpu { |
| 434 | sound-dai = <&rcar_sound>; |
| 435 | }; |
| 436 | |
| 437 | sndcodec: simple-audio-card,codec { |
| 438 | sound-dai = <&ak4643>; |
| 439 | system-clock-frequency = <11289600>; |
| 440 | }; |
| 441 | }; |
| 442 | |
| 443 | # -------------------- |
| 444 | # 2 CPU 1 Codec (Mixing) |
| 445 | # -------------------- |
| 446 | - | |
| 447 | sound { |
| 448 | compatible = "simple-audio-card"; |
| 449 | #address-cells = <1>; |
| 450 | #size-cells = <0>; |
| 451 | |
| 452 | simple-audio-card,name = "rsnd-ak4643"; |
| 453 | simple-audio-card,format = "left_j"; |
| 454 | simple-audio-card,bitclock-master = <&dpcmcpu>; |
| 455 | simple-audio-card,frame-master = <&dpcmcpu>; |
| 456 | |
| 457 | simple-audio-card,convert-rate = <48000>; |
| 458 | simple-audio-card,convert-channels = <2>; |
| 459 | |
| 460 | simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback", |
| 461 | "ak4642 Playback", "DAI1 Playback"; |
| 462 | |
| 463 | dpcmcpu: simple-audio-card,cpu@0 { |
| 464 | reg = <0>; |
| 465 | sound-dai = <&rcar_sound 0>; |
| 466 | }; |
| 467 | |
| 468 | simple-audio-card,cpu@1 { |
| 469 | reg = <1>; |
| 470 | sound-dai = <&rcar_sound 1>; |
| 471 | }; |
| 472 | |
| 473 | simple-audio-card,codec { |
| 474 | prefix = "ak4642"; |
| 475 | sound-dai = <&ak4643>; |
| 476 | clocks = <&audio_clock>; |
| 477 | }; |
| 478 | }; |
| 479 | |
| 480 | # -------------------- |
| 481 | # Multi DAI links with DPCM: |
| 482 | # |
| 483 | # CPU0 ------ ak4613 |
| 484 | # CPU1 ------ PCM3168A-p /* DPCM 1ch/2ch */ |
| 485 | # CPU2 --/ /* DPCM 3ch/4ch */ |
| 486 | # CPU3 --/ /* DPCM 5ch/6ch */ |
| 487 | # CPU4 --/ /* DPCM 7ch/8ch */ |
| 488 | # CPU5 ------ PCM3168A-c |
| 489 | # -------------------- |
| 490 | - | |
| 491 | sound { |
| 492 | compatible = "simple-audio-card"; |
| 493 | #address-cells = <1>; |
| 494 | #size-cells = <0>; |
| 495 | |
| 496 | simple-audio-card,routing = |
| 497 | "pcm3168a Playback", "DAI1 Playback", |
| 498 | "pcm3168a Playback", "DAI2 Playback", |
| 499 | "pcm3168a Playback", "DAI3 Playback", |
| 500 | "pcm3168a Playback", "DAI4 Playback"; |
| 501 | |
| 502 | simple-audio-card,dai-link@0 { |
| 503 | reg = <0>; |
| 504 | format = "left_j"; |
| 505 | bitclock-master = <&sndcpu0>; |
| 506 | frame-master = <&sndcpu0>; |
| 507 | |
| 508 | sndcpu0: cpu { |
| 509 | sound-dai = <&rcar_sound 0>; |
| 510 | }; |
| 511 | codec { |
| 512 | sound-dai = <&ak4613>; |
| 513 | }; |
| 514 | }; |
| 515 | |
| 516 | simple-audio-card,dai-link@1 { |
| 517 | reg = <1>; |
| 518 | format = "i2s"; |
| 519 | bitclock-master = <&sndcpu1>; |
| 520 | frame-master = <&sndcpu1>; |
| 521 | |
| 522 | convert-channels = <8>; /* TDM Split */ |
| 523 | |
| 524 | sndcpu1: cpu-0 { |
| 525 | sound-dai = <&rcar_sound 1>; |
| 526 | }; |
| 527 | cpu-1 { |
| 528 | sound-dai = <&rcar_sound 2>; |
| 529 | }; |
| 530 | cpu-2 { |
| 531 | sound-dai = <&rcar_sound 3>; |
| 532 | }; |
| 533 | cpu-3 { |
| 534 | sound-dai = <&rcar_sound 4>; |
| 535 | }; |
| 536 | codec { |
| 537 | mclk-fs = <512>; |
| 538 | prefix = "pcm3168a"; |
| 539 | dai-tdm-slot-num = <8>; |
| 540 | sound-dai = <&pcm3168a 0>; |
| 541 | }; |
| 542 | }; |
| 543 | |
| 544 | simple-audio-card,dai-link@2 { |
| 545 | reg = <2>; |
| 546 | format = "i2s"; |
| 547 | bitclock-master = <&sndcpu2>; |
| 548 | frame-master = <&sndcpu2>; |
| 549 | |
| 550 | sndcpu2: cpu { |
| 551 | sound-dai = <&rcar_sound 5>; |
| 552 | }; |
| 553 | codec { |
| 554 | mclk-fs = <512>; |
| 555 | prefix = "pcm3168a"; |
| 556 | sound-dai = <&pcm3168a 1>; |
| 557 | }; |
| 558 | }; |
| 559 | }; |