Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

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>;
		};
	};
};