[alsa-devel] Multiple codecs on one sound card for multi-channel sound card
arnaud.mouiche at invoxia.com
arnaud.mouiche at invoxia.com
Wed Sep 16 11:57:10 CEST 2015
Hello Caleb,
Multi-codec support is now working fine the current linux releases.
for previous releases, check if commit
[PATCH] ASoC: dapm: Don't add prefix to widget stream name
is included. I remember this is the last required patch.
After that, I don't know if the "simple-card" can be configured for
multi codec support as you wish.
On my side, I cooked a particular sound card for the purpose.
here is some tips:
struct snd_soc_dai_link_component codecs[2];
struct snd_soc_codec_conf codecs_conf[2];
[...]
for (num_codecs=0; num_codecs<2; num_codecs++) {
struct device_node *of_node;
of_node = of_parse_phandle(pdev->dev.of_node, "audio-codec",
num_codecs);
if (!of_node) break;
data->codecs[num_codecs].of_node = of_node;
data->codecs[num_codecs].dai_name = "tlv320aic3x-foo";
/* add a "C2" name prefix for every control of the 2nd codec */
data->codecs_conf[num_codecs].of_node = of_node;
if (num_codecs == 1) {
data->codecs_conf[num_codecs].name_prefix = "C2";
}
}
[...]
data->dai.codecs = data->codecs;
data->dai.num_codecs = num_codecs;
data->card.dai_link = &data->dai;
data->card.codec_conf = data->codecs_conf;
data->card.num_configs = num_codecs;
[...]
On DTS side, I have something like
sound at 0 {
compatible = "fsl,imx-audio-foo";
model = "foo-audio";
ssi-controller = <&ssi1>;
/*
* list phandles for the 2 codecs used in the same TDM network
*/
audio-codec = <&codec1>, <&codec2>;
[...]
};
You also need to have a particular hw_params() method to dispatch the
TDM and sysclk configuration to your codecs, making the difference
between your first codec (your bus master) and the others.
Arnaud
Le 15/09/2015 03:07, Caleb Crome a écrit :
> (re-sending hope it's not a duplicate -- I think I must have had HTML
> in my previous email and it was ignored)
>
> Hi all,
> What are the current best practices to specify multiple codecs on
> one sound card, with all codecs sharing a single TDM bus?
>
> I have a card with up to 32 TLV320AIC33 codecs on it. For the
> moment, we can limit the discussion to only 16 codecs, so we don't
> have to get extra serializers involved...
>
> I currently have something like this in my am335x-boneblack.dts file:
>
> (i.e. attempting to set tdm slot width and num in the i2c codec)
>
> but it doesn't seem to be picking up the fact that I want all the
> codecs linked together as one.
>
> (FYI, the first codec, i.e. tlv32aic3x_a should be the master, and
> all others including the CPU will be slaves).
>
> Thanks for any help!
>
> BTW, I'm happy to use whatever kernel will support me with the
> minimal amount of effort, currently using 4.1
>
>
>
> Thank you!
> -Caleb
>
> &i2c1 {
> ...
> tlv320aic3x_a: tlv320aic3x at 18 {
> #sound-dai-cells = <1>;
> compatible = "ti,tlv320aic3x";
> reg = <0x18>;
> tdm-offset = <0>;
> status = "okay";
> };
> tlv320aic3x_b: tlv320aic3x at 19 {
> #sound-dai-cells = <1>;
> compatible = "ti,tlv320aic3x";
> reg = <0x19>;
> tdm-offset = <32>;
> status = "okay";
> };
> tlv320aic3x_c: tlv320aic3x at 1a {
> #sound-dai-cells = <1>;
> compatible = "ti,tlv320aic3x";
> reg = <0x1a>;
> tdm-offset = <64>;
> status = "okay";
> };
> tlv320aic3x_d: tlv320aic3x at 1b {
> #sound-dai-cells = <1>;
> compatible = "ti,tlv320aic3x";
> reg = <0x1b>;
> tdm-offset = <96>;
> status = "okay";
> };
> };
>
> &mcasp0 {
> #sound-dai-cells = <0>;
> pinctrl-names = "default";
> pinctrl-0 = <&mcasp_0_pins_default>;
> status = "okay";
>
> op-mode = <0>; /* MCASP_IIS_MODE */
> tdm-slots = <16>;
> num-serializer = <16>;
> serial-dir = < /* 0: INACTIVE, 1: TX, 2: RX */
> 0 0 1 2
> 0 0 0 0
> 0 0 0 0
> 0 0 0 0
>> ;
> tx-num-evt = <1>;
> rx-num-evt = <1>;
> };
>
> / {
> sound {
> compatible = "simple-audio-card";
> simple-audio-card,name = "puppy-audio";
> simple-audio-card,mclk-fs = <256>;
> system-clock-frequency = <12288000>;
> status = "okay";
> simple-audio-card,bitclock-master = <&tlv320aic3x_a>;
> simple-audio-card,frame-master = <&tlv320aic3x_a>;
> simple-audio-card,widgets =
> "Line", "Line Out",
> "Line", "Line In";
> simple-audio-card,routing =
> "Line Out", "HPLOUT",
> "Line Out", "HPROUT",
> "Line In", "LINE1L",
> "Line In", "LINE1R";
>
> simple-audio-card,dai-link at 0 {
> format = "left_j";
> cpu {
> sound-dai = <&mcasp0>;
> };
> codec {
> sound-dai = <&tlv320aic3x_a 0>;
> dai-tdm-slot-num = <0>;
> dai-tdm-slot-width = <16>;
> };
> };
> /**** The stuff below doesn't work -- I can't figure out how to get
> the name_prefixes set
> on each codec... .How do I set up so that each codec gets its own name prfix
> and so that the soc core thinks all codecs are on the same DAI?
> **** */
>
> // simple-audio-card,dai-link at 1 {
> // format = "left_j";
> // cpu {
> // sound-dai = <&mcasp0>;
> // };
> // codec {
> // sound-dai = <&tlv320aic3x_b 0>;
> // dai-tdm-slot-num = <2>;
> // dai-tdm-slot-width = <16>;
> // };
> // };
> // simple-audio-card,dai-link at 2 {
> // format = "left_j";
> // cpu {
> // sound-dai = <&mcasp0>;
> // };
> // codec {
> // sound-dai = <&tlv320aic3x_c>;
> // dai-tdm-slot-num = <4>;
> // dai-tdm-slot-width = <16>;
> // };
> // };
> // simple-audio-card,dai-link at 3 {
> // format = "left_j";
> // cpu {
> // sound-dai = <&mcasp0>;
> // };
> // codec {
> // sound-dai = <&tlv320aic3x_d>;
> // dai-tdm-slot-num = <6>;
> // dai-tdm-slot-width = <16>;
> // };
> // };
> };
> };
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
More information about the Alsa-devel
mailing list