How to model 3xADAU1761 codec in TDM8 with 2xSAI in ALSA ?

Rolf Peder Klemetsen rpk at systemsoft.no
Tue Mar 10 20:21:10 CET 2020


Hi,

Thanks Lars.
I finally got prefix working by adding "sound-name-prefix" to the
adau1761 definitions under &i2c0. And as you stated the controls are
now name "c1 LOUT", etc. So that is good!
But I still haven't got multi-codec to work; only the first codec in
each dailink is enumerated. The others are ignored.

To me it seems that Asoc simple card supports multi-codec. See for
example  here:
https://www.alsa-project.org/pipermail/alsa-devel/2018-March/133104.html
and "Example 2 - many DAI links and multi-CODECs".
I am unable to spot what is wrong with my dailink definition compared
to the above example.

/Rolf








tir. 10. mar. 2020 kl. 14:28 skrev Lars-Peter Clausen <lars at metafoo.de>:
>
> On 3/9/20 9:33 AM, Rolf Peder Klemetsen wrote:
> > Hello,
> >
> > I am working on bringup of a custom board that has three ADAU1761
> > codecs, and a NXP LS1028A SoC. The codecs are supposed to be
> > configured in TDM8 mode and share a common playback I2S bus connected
> > to SAI4, and a common capture I2S bus connected to SAI3.
> > What is the recommended way of modelling this setup in the Linux device tree ?
> >
> > So far I have tried the following:
> >
> > &i2c0 {
> >      status = "okay";
> >
> >      i2c_codec1: adau1761 at 38 {
> >          compatible = "adi,adau1761";
> >          #sound-dai-cells=<0>;
> >          reg = <0x38>;
> >          tdm-offset = <0>;
> >          clocks = <&adau1761_mclk>;
> >          clock-names = "mclk";
> >      };
> >
> >      i2c_codec2: adau1761 at 39 {
> >          compatible = "adi,adau1761";
> >          #sound-dai-cells=<0>;
> >          reg = <0x39>;
> >          tdm-offset = <16>;
> >          clocks = <&adau1761_mclk>;
> >          clock-names = "mclk";
> >      };
> >
> >      i2c_codec3: adau1761 at 3a {
> >          compatible = "adi,adau1761";
> >          #sound-dai-cells=<0>;
> >          reg = <0x3a>;
> >          tdm-offset = <32>;
> >          clocks = <&adau1761_mclk>;
> >          clock-names = "mclk";
> >      };
> > };
> >
> > At first I attempted creating three simple-audio-card's. That
> > attempted failed since sharing the same cpu (SAI3 and SAI4) failed
> > with no ALSA device as a result.
> >
> > Then I attempted creating a single simple-audio-card with two
> > dai-links (one for playback and one for capture), each containing
> > three codec sub-nodes.
> > That doesn't really work either. Can someone please point me in the
> > right direction?
> > Many of the parameters that I have put in the dts have no effect and
> > are assumed not supported.
>
> Hi,
>
> One physical sound card is definitely the right direction. If you need
> multiple sound cards exposed to userspace you can use the ALSA plugin
> architecture to create multiple virtual sound cards on top of the one
> sound card.
>
> Do you know why your approach with a single sound card does not work, do
> you get any error messages? Is the sound card registered?
>
> The primary use case of the simple-audio-card is as the name suggests
> simple setups and your setup is not that simple. It is possible that
> your particular setup has never been tested with the simple-sound-card
> and there are still some hidden bugs. It might also be the case that you
> might have to create a custom sound card driver for your setup if you
> can't make it work with the simple card driver.
>
> I believe I can see at least on issue with your DT snipped. For the
> widgets that are registered by the CODECs the prefix will be added to
> the name. So for example "LOUT" has to be "c1 LOUT", in addition you'll
> have to add one route for each sound card.
>
> - Lars
>
> >
> > Regards
> > Rolf
> >
> > sound {
> >          status = "okay";
> >          model = "Super Sound System";
> >          compatible = "simple-audio-card";
> >          simple-audio-card,name = "sound";
> >          simple-audio-card,format = "i2s";
> >          simple-audio-card,bitclock-master = <&p_snd_codec_o1>;
> >          simple-audio-card,frame-master = <&p_snd_codec_o1>;
> >          simple-audio-card,widgets =
> >              "Microphone", "Mic In",
> >              "Headphone", "Headphone Out",
> >              "Line", "Line In",
> >              "Line", "Line Out";
> >
> >          simple-audio-card,routing =
> >              "Line Out", "LOUT",
> >              "Line Out", "ROUT",
> >              "Headphone Out", "LHP",
> >              "Headphone Out", "RHP",
> >              "Mic In", "MICBIAS",
> >              "LINN", "Mic In",
> >              "RINN", "Mic In",
> >              "LINP", "Mic In",
> >              "RINP", "Mic In",
> >              "LAUX", "Line In",
> >              "RAUX", "Line In";
> >
> >          playback_link: simple-audio-card,dai-link at 0 {
> >              format = "i2s";
> >              convert-channels = <8>;
> >              bitclock-master = <&p_snd_codec_o1>;
> >              frame-master = <&p_snd_codec_o1>;
> >              name-prefix = "p";
> >
> >              snd_dai_playback: cpu at 0 {
> >
> >                  cpu-dai-name = "sai4_0";
> >                  sound-dai-name = "sai4_0";
> >
> >
> >                  sound-dai = <&sai4 0>;
> >                  dai-tdm-slot-num = <8>;
> >                  dai-tdm-slot-width = <16>;
> >                  dai-tdm-slot-tx-mask = <1 0 1 0 1 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 0 0 0 0 0>;
> >              };
> >
> >              p_snd_codec_o1: codec at 0 {
> >                  sound-dai = <&i2c_codec1>;
> >                  frame-master;
> >                  bitclock-master;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-frequency = <12288000>;
> >                  clock-names = "mclk";
> >                  name-prefix = "c1";
> >                  dai-tdm-slot-tx-mask = <1 0 0 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 0 0 0 0 0>;
> >              };
> >
> >              p_snd_codec_o2: codec at 1 {
> >                  sound-dai = <&i2c_codec2>;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-frequency = <12288000>;
> >                  clock-names = "mclk";
> >                  name-prefix = "c2";
> >                  dai-tdm-slot-tx-mask = <0 0 1 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 0 0 0 0 0>;
> >              };
> >              p_snd_codec_o3: codec at 2 {
> >                  sound-dai = <&i2c_codec3>;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-frequency = <12288000>;
> >                  clock-names = "mclk";
> >                  name-prefix = "c3";
> >                  dai-tdm-slot-tx-mask = <0 0 0 0 1 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 0 0 0 0 0>;
> >              };
> >
> >
> >          };
> >
> >          capture_link: simple-audio-card,dai-link at 1 {
> >              format = "i2s";
> >              convert-channels = <8>;
> >              bitclock-master = <&c_snd_codec_o1>;
> >              frame-master = <&c_snd_codec_o1>;
> >              name-prefix = "c";
> >
> >              snd_dai_capture: cpu at 0 {
> >                  sound-dai = <&sai3>;
> >                  dai-tdm-slot-num = <8>;
> >                  dai-tdm-slot-width = <16>;
> >                  dai-tdm-slot-tx-mask = <0 0 0 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 1 0 1 0 1 0 0>;
> >              };
> >
> >              c_snd_codec_o1: codec at 0 {
> >                  sound-dai = <&i2c_codec1>;
> >                  frame-master;
> >                  bitclock-master;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-names = "mclk";
> >                  clock-frequency = <12288000>;
> >                  name-prefix = "c1";
> >                  dai-tdm-slot-tx-mask = <0 0 0 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 1 0 0 0 0 0 0>;
> >              };
> >
> >              c_snd_codec_o2: codec at 1 {
> >                  sound-dai = <&i2c_codec2>;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-names = "mclk";
> >                  clock-frequency = <12288000>;
> >                  name-prefix = "c2";
> >                  dai-tdm-slot-tx-mask = <0 0 0 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 1 0 0 0 0>;
> >              };
> >              c_snd_codec_o3: codec at 2 {
> >                  sound-dai = <&i2c_codec3>;
> >                  clocks=<&adau1761_mclk>;
> >                  clock-names = "mclk";
> >                  clock-frequency = <12288000>;
> >                  name-prefix = "c3";
> >                  dai-tdm-slot-tx-mask = <0 0 0 0 0 0 0 0>;
> >                  dai-tdm-slot-rx-mask = <0 0 0 0 0 1 0 0>;
> >              };
> >
> >
> >          };
>
>


More information about the Alsa-devel mailing list