summaryrefslogtreecommitdiffstats
path: root/Documentation/devicetree/bindings/sound/simple-card.txt
blob: 79954cd6e37b4688daddcb4d78be5a0dc72de690 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
Simple-Card:

Simple-Card specifies audio DAI connections of SoC <-> codec.

Required properties:

- compatible				: "simple-audio-card"

Optional properties:

- simple-audio-card,name		: User specified audio sound card name, one string
					  property.
- simple-audio-card,widgets		: Please refer to widgets.txt.
- simple-audio-card,routing		: A list of the connections between audio components.
					  Each entry is a pair of strings, the first being the
					  connection's sink, the second being the connection's
					  source.
- simple-audio-card,mclk-fs             : Multiplication factor between stream rate and codec
					  mclk. When defined, mclk-fs property defined in
					  dai-link sub nodes are ignored.
- simple-audio-card,hp-det-gpio		: Reference to GPIO that signals when
					  headphones are attached.
- simple-audio-card,mic-det-gpio	: Reference to GPIO that signals when
					  a microphone is attached.
- simple-audio-card,aux-devs		: List of phandles pointing to auxiliary devices, such
					  as amplifiers, to be added to the sound card.
- simple-audio-card,pin-switches	: List of strings containing the widget names for
					  which pin switches must be created.

Optional subnodes:

- simple-audio-card,dai-link		: Container for dai-link level
					  properties and the CPU and CODEC
					  sub-nodes. This container may be
					  omitted when the card has only one
					  DAI link. See the examples and the
					  section below.

Dai-link subnode properties and subnodes:

If dai-link subnode is omitted and the subnode properties are directly
under "sound"-node the subnode property and subnode names have to be
prefixed with "simple-audio-card,"-prefix.

Required dai-link subnodes:

- cpu					: CPU   sub-node
- codec					: CODEC sub-node

Optional dai-link subnode properties:

- format				: CPU/CODEC common audio format.
					  "i2s", "right_j", "left_j" , "dsp_a"
					  "dsp_b", "ac97", "pdm", "msb", "lsb"
- frame-master				: Indicates dai-link frame master.
					  phandle to a cpu or codec subnode.
- bitclock-master			: Indicates dai-link bit clock master.
					  phandle to a cpu or codec subnode.
- bitclock-inversion			: bool property. Add this if the
					  dai-link uses bit clock inversion.
- frame-inversion			: bool property. Add this if the
					  dai-link uses frame clock inversion.
- mclk-fs             			: Multiplication factor between stream
					  rate and codec mclk, applied only for
					  the dai-link.

For backward compatibility the frame-master and bitclock-master
properties can be used as booleans in codec subnode to indicate if the
codec is the dai-link frame or bit clock master. In this case there
should be no dai-link node, the same properties should not be present
at sound-node level, and the bitclock-inversion and frame-inversion
properties should also be placed in the codec node if needed.

Required CPU/CODEC subnodes properties:

- sound-dai				: phandle and port of CPU/CODEC

Optional CPU/CODEC subnodes properties:

- dai-tdm-slot-num			: Please refer to tdm-slot.txt.
- dai-tdm-slot-width			: Please refer to tdm-slot.txt.
- clocks / system-clock-frequency	: specify subnode's clock if needed.
					  it can be specified via "clocks" if system has
					  clock node (= common clock), or "system-clock-frequency"
					  (if system doens't support common clock)
					  If a clock is specified, it is
					  enabled with clk_prepare_enable()
					  in dai startup() and disabled with
					  clk_disable_unprepare() in dai
					  shutdown().
					  If a clock is specified and a
					  multiplication factor is given with
					  mclk-fs, the clock will be set to the
					  calculated mclk frequency when the
					  stream starts.
- system-clock-direction-out		: specifies clock direction as 'out' on
					  initialization. It is useful for some aCPUs with
					  fixed clocks.

-------------------------------------------
Example 1 - single DAI link:
-------------------------------------------

sound {
	compatible = "simple-audio-card";
	simple-audio-card,name = "VF610-Tower-Sound-Card";
	simple-audio-card,format = "left_j";
	simple-audio-card,bitclock-master = <&dailink0_master>;
	simple-audio-card,frame-master = <&dailink0_master>;
	simple-audio-card,widgets =
		"Microphone", "Microphone Jack",
		"Headphone", "Headphone Jack",
		"Speaker", "External Speaker";
	simple-audio-card,routing =
		"MIC_IN", "Microphone Jack",
		"Headphone Jack", "HP_OUT",
		"External Speaker", "LINE_OUT";

	simple-audio-card,cpu {
		sound-dai = <&sh_fsi2 0>;
	};

	dailink0_master: simple-audio-card,codec {
		sound-dai = <&ak4648>;
		clocks = <&osc>;
	};
};

&i2c0 {
	ak4648: ak4648@12 {
		#sound-dai-cells = <0>;
		compatible = "asahi-kasei,ak4648";
		reg = <0x12>;
	};
};

sh_fsi2: sh_fsi2@ec230000 {
	#sound-dai-cells = <1>;
	compatible = "renesas,sh_fsi2";
	reg = <0xec230000 0x400>;
	interrupt-parent = <&gic>;
	interrupts = <0 146 0x4>;
};

-------------------------------------------
Example 2 - many DAI links:
-------------------------------------------

sound {
	compatible = "simple-audio-card";
	simple-audio-card,name = "Cubox Audio";

	simple-audio-card,dai-link@0 {		/* I2S - HDMI */
		reg = <0>;
		format = "i2s";
		cpu {
			sound-dai = <&audio1 0>;
		};
		codec {
			sound-dai = <&tda998x 0>;
		};
	};

	simple-audio-card,dai-link@1 {		/* S/PDIF - HDMI */
		reg = <1>;
		cpu {
			sound-dai = <&audio1 1>;
		};
		codec {
			sound-dai = <&tda998x 1>;
		};
	};

	simple-audio-card,dai-link@2 {		/* S/PDIF - S/PDIF */
		reg = <2>;
		cpu {
			sound-dai = <&audio1 1>;
		};
		codec {
			sound-dai = <&spdif_codec>;
		};
	};
};

-------------------------------------------
Example 3 - route audio from IMX6 SSI2 through TLV320DAC3100 codec
through TPA6130A2 amplifier to headphones:
-------------------------------------------

&i2c0 {
	codec: tlv320dac3100@18 {
		compatible = "ti,tlv320dac3100";
		...
	}

	amp: tpa6130a2@60 {
		compatible = "ti,tpa6130a2";
		...
	}
}

sound {
	compatible = "simple-audio-card";
	...
	simple-audio-card,widgets =
		"Headphone", "Headphone Jack";
	simple-audio-card,routing =
		"Headphone Jack", "HPLEFT",
		"Headphone Jack", "HPRIGHT",
		"LEFTIN", "HPL",
		"RIGHTIN", "HPR";
	simple-audio-card,aux-devs = <&amp>;
	simple-audio-card,cpu {
		sound-dai = <&ssi2>;
	};
	simple-audio-card,codec {
		sound-dai = <&codec>;
		clocks = ...
	};
};

-------------------------------------------
Example 4. Sampling Rate Conversion
-------------------------------------------

sound {
	compatible = "simple-audio-card";

	simple-audio-card,name = "rsnd-ak4643";
	simple-audio-card,format = "left_j";
	simple-audio-card,bitclock-master = <&sndcodec>;
	simple-audio-card,frame-master = <&sndcodec>;

	simple-audio-card,convert-rate = <48000>;

	simple-audio-card,prefix = "ak4642";
	simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback",
			"DAI0 Capture", "ak4642 Capture";

	sndcpu: simple-audio-card,cpu {
		sound-dai = <&rcar_sound>;
	};

	sndcodec: simple-audio-card,codec {
		sound-dai = <&ak4643>;
		system-clock-frequency = <11289600>;
	};
};

-------------------------------------------
Example 5. 2 CPU 1 Codec (Mixing)
-------------------------------------------
sound {
	compatible = "simple-audio-card";

	simple-audio-card,name = "rsnd-ak4643";
	simple-audio-card,format = "left_j";
	simple-audio-card,bitclock-master = <&dpcmcpu>;
	simple-audio-card,frame-master = <&dpcmcpu>;

	simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback",
			"ak4642 Playback", "DAI1 Playback";

	dpcmcpu: cpu@0 {
		sound-dai = <&rcar_sound 0>;
	};

	cpu@1 {
		sound-dai = <&rcar_sound 1>;
	};

	codec {
		prefix = "ak4642";
		sound-dai = <&ak4643>;
		clocks = <&audio_clock>;
	};
};

-------------------------------------------
Example 6 - many DAI links with DPCM:
-------------------------------------------

CPU0 ------ ak4613
CPU1 ------ PCM3168A-p  /* DPCM 1ch/2ch */
CPU2 --/                /* DPCM 3ch/4ch */
CPU3 --/                /* DPCM 5ch/6ch */
CPU4 --/                /* DPCM 7ch/8ch */
CPU5 ------ PCM3168A-c

sound {
	compatible = "simple-audio-card";

	simple-audio-card,routing =
		  "pcm3168a Playback", "DAI1 Playback",
		  "pcm3168a Playback", "DAI2 Playback",
		  "pcm3168a Playback", "DAI3 Playback",
		  "pcm3168a Playback", "DAI4 Playback";

	simple-audio-card,dai-link@0 {
		format = "left_j";
		bitclock-master = <&sndcpu0>;
		frame-master = <&sndcpu0>;

		sndcpu0: cpu {
			sound-dai = <&rcar_sound 0>;
		};
		codec {
			sound-dai = <&ak4613>;
		};
	};
	simple-audio-card,dai-link@1 {
		format = "i2s";
		bitclock-master = <&sndcpu1>;
		frame-master = <&sndcpu1>;

		convert-channels = <8>; /* TDM Split */

		sndcpu1: cpu@0 {
			sound-dai = <&rcar_sound 1>;
		};
		cpu@1 {
			sound-dai = <&rcar_sound 2>;
		};
		cpu@2 {
			sound-dai = <&rcar_sound 3>;
		};
		cpu@3 {
			sound-dai = <&rcar_sound 4>;
		};
		codec {
			mclk-fs = <512>;
			prefix = "pcm3168a";
			dai-tdm-slot-num = <8>;
			sound-dai = <&pcm3168a 0>;
		};
	};
	simple-audio-card,dai-link@2 {
		format = "i2s";
		bitclock-master = <&sndcpu2>;
		frame-master = <&sndcpu2>;

		sndcpu2: cpu {
			sound-dai = <&rcar_sound 5>;
		};
		codec {
			mclk-fs = <512>;
			prefix = "pcm3168a";
			sound-dai = <&pcm3168a 1>;
		};
	};
};