[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