All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
To: Mark Brown <broonie@kernel.org>
Cc: Sameer Pujar <spujar@nvidia.com>,
	Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>,
	Linux-ALSA <alsa-devel@alsa-project.org>
Subject: Re: More Generic Audio Graph Sound Card idea
Date: 13 Oct 2020 13:50:25 +0900	[thread overview]
Message-ID: <87imbeybq5.wl-kuninori.morimoto.gx@renesas.com> (raw)
In-Reply-To: <87k0xszlep.wl-kuninori.morimoto.gx@renesas.com>


Hi ALSA ML


> I'm thinking below style as new audio-graph-card2.
> It is not tricky, thus connection judgement for normal vs DSP is easy.
> Then, code can be more readable (= no guaranty :P) ?

I have proposed DPCM connection idea for audio-card2 before,
and proposed Multi-CPU/Codec connection idea later.
I'm not yet implemented these, but I want to merge / reuse these
idea to keep simple code.

By this mail, I want to propose Codec2Codec idea.
It is almost same idea with DPCM, Multi-CPU/Codec,
and is last parts for missing feature.

I think this idea can be generic and easy to update
in the future (if needed).

But, I want feedback, opinion.
I wonder does it works for your use-case ?

-- Image ---

Codec2Codec

Codec1 <--> Codec2

-- DT Image --

   +--+
=> |  |<--> Codec1
   |  |<--> Codec2
   +--+

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&codec2codec>;
	};

	CODEC2CODEC {
		compatible = "audio-graph-card2-codec2codec";

		ports {
			codec2codec: port@0 { fe_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
			             port@1 { be_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
		};
	};

 	Codec1 {
		port@0 { codec1_ep: endpoint { remote-endpoint = <&fe_ep>; }; };
	};

 	Codec2 {
		port@0 { codec2_ep: endpoint { remote-endpoint = <&be_ep>; }; };
	};


-- Image ---

          *******
PCM0 <--> *     * <--> DAI0: Codec Headset
PCM1 <--> *     * <--> DAI1: Codec Speakers
PCM2 <--> * DSP * <--> DAI2: MODEM
PCM3 <--> *     * <--> DAI3: BT
          *     * <--> DAI4: DMIC
          *     * <--> DAI5: FM
          *******

-- DT Image --

   +--+                ****                 +--+
=> |  |<--> PCM0       *  * <-- (dummy) --> |  | <=
   |  |<-- (dummy) --> *  *       DAI0 <--> |  |
   +--+                *  *                 +--+
                       *  *            
   +--+                *  *                 +--+
=> |  |<--> PCM1       *  * <-- (dummy) --> |  | <=
   |  |<-- (dummy) --> *  *       DAI1 <--> |  |
   +--+                *  *                 +--+
   ...                 ...                 ...


-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		/* indicate all Front-End, Back-End in DPCM case */
		dais = <&dsp_fe0, &dsp_fe1, &dsp_fe2, &dsp_fe3,
		        &dsp_be0, &dsp_be1, &dsp_be2, &dsp_be3, &dsp_be4, &dsp_be5>;
	};

	DSP {
		compatible = "audio-graph-card2-dsp";

		ports@0 {
			/* Front-End is pcm0_ep, Back-End is dummy */
			dsp_fe0: port@0 { dsp_fe0_ep: endpoint { remote-endpoint = <&pcm0_ep>; }; };
			         port@1 { };
		};

		...

		ports@4 {
			/* Front-End is dummy, Back-End is dai_ep */
			dsp_be0: port@0 { };
			         port@1 { dsp_be0_ep: endpoint { remote-endpoint = <&dai0_ep>; }; };
		};

		...

	};

 	CPU {
		ports {
			port@0 { pcm0_ep: endpoint { remote-endpoint = <&dsp_fe0_ep>; }; };
			port@1 { pcm1_ep: endpoint { remote-endpoint = <&dsp_fe1_ep>; }; };
			port@2 { pcm2_ep: endpoint { remote-endpoint = <&dsp_fe2_ep>; }; };
			port@3 { pcm3_ep: endpoint { remote-endpoint = <&dsp_fe3_ep>; }; };
			...
		};
	};

	Codec {
		ports {
			port@0 { dai0_ep: endpoint { remote-endpoint = <&dsp_be0_ep>; }; };
			port@1 { dai1_ep: endpoint { remote-endpoint = <&dsp_be1_ep>; }; };
			port@2 { dai2_ep: endpoint { remote-endpoint = <&dsp_be2_ep>; }; };
			port@3 { dai3_ep: endpoint { remote-endpoint = <&dsp_be3_ep>; }; };
			port@4 { dai4_ep: endpoint { remote-endpoint = <&dsp_be4_ep>; }; };
			port@5 { dai5_ep: endpoint { remote-endpoint = <&dsp_be5_ep>; }; };
			...
		};
	};


-- Image ---

As Sample, Normal Audio-Graph

CPU <---> Codec (Same as before)

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&cpu>;
	};

	CPU {
		cpu: port { cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
	};

	Codec {
		codec: port { codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
	};


-- Image ---

Multi-CPU/Codec
(complex connection as sample)

<- multi_CPU_0 ->
           ******
CPU01 <--> *    * <--> Codec0
       \-> *    *
CPU02 <--> *    *
           ******

           <-- multi_codec_1 -->
          ******
CPU1 <--> *    * <--> Codec11
          *    * <-/
          *    * <--> Codec12
          ******

-- DT Image --

   +--+                     +--+
=> |  | <--> CPU01_1     => |  | <--> CPU1
   |  | <--> CPU01_2        |  |
   |  | <--> CPU02          |  | <--> Codec11_1
   |  |                     |  | <--> Codec11_2
   |  | <--> Codec0         |  | <--> Codec12
   +--+                     +--+

-- DT Sample --

	sound {
		compatible = "audio-graph-card2";

		dais = <&cpu_0,
		        &cpu_1>;
	};

	MULTI0 {
		compatible = "audio-graph-card2-multi";

		cpu_0: ports@0 {
			port@0 { fe0_1_ep: endpoint { remote-endpoint = <&cpu01_1_ep>; }; };
			port@1 { fe0_2_ep: endpoint { remote-endpoint = <&cpu01_2_ep>; }; };
			port@2 { fe0_3_ep: endpoint { remote-endpoint = <&cpu02_ep>; }; };
		};
		ports@1 {
			port@0 { be0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
		};
	};

	MULTI1 {
		compatible = "audio-graph-card2-multi";

		cpu_1: ports@0 {
			port@0 { fe1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
		};
		ports@1 {
			port@0 { be1_1_ep: endpoint { remote-endpoint = <&codec11_1_ep>; }; };
			port@1 { be1_2_ep: endpoint { remote-endpoint = <&codec11_2_ep>; }; };
			port@2 { be1_3_ep: endpoint { remote-endpoint = <&codec12_ep>; }; };
		};
	};

	CPU01 {
		ports {
			port@0 { cpu01_1_ep: endpoint { remote-endpoint = <&fe0_1_ep>; }; };
			port@1 { cpu01_2_ep: endpoint { remote-endpoint = <&fe0_2_ep>; }; };
			...
		};
	};

	CPU02 {
		ports {
			port@0 { cpu02_ep: endpoint { remote-endpoint = <&fe0_3_ep>; }; };
			...
		};
	};

	CPU1 {
		ports {
			port@0 { cpu1_ep: endpoint { remote-endpoint = <&fe1_ep>; }; };
			...
		};
	};

	Codec0 {
		ports {
			port@0 { codec0_ep: endpoint { remote-endpoint = <&be0_ep>; }; };
			port@1 { ... };
		};
	};

	Codec11 {
		ports {
			port@0 { codec11_1_ep: endpoint { remote-endpoint = <&be1_1_ep>; }; };
			port@1 { codec11_2_ep: endpoint { remote-endpoint = <&be1_2_ep>; }; };
			port@2 { ... };
		};
	};

	Codec12 {
		ports {
			port@0 { codec12_ep: endpoint { remote-endpoint = <&be1_3_ep>; }; };
			port@1 { ... };
		};
	};

  parent reply	other threads:[~2020-10-13  4:51 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-21  4:15 More Generic Audio Graph Sound Card idea Kuninori Morimoto
2020-08-21  5:26 ` Sameer Pujar
2020-08-21  7:14   ` Kuninori Morimoto
2020-08-21  8:28     ` Sameer Pujar
2020-08-21 13:02       ` Mark Brown
2020-09-25  1:43     ` Kuninori Morimoto
2020-09-25 19:22       ` Mark Brown
2020-09-25 20:04         ` Pierre-Louis Bossart
2020-09-25 20:10           ` Mark Brown
2020-09-25 20:50             ` Pierre-Louis Bossart
2020-08-21  7:11 ` Daniel Baluta
2020-08-21  7:25   ` Kuninori Morimoto
2020-08-21  7:33     ` Daniel Baluta
2020-08-21 11:47     ` Mark Brown
2020-08-21 12:18 ` Mark Brown
2020-08-24  0:25   ` Kuninori Morimoto
2020-08-24  6:25     ` Sameer Pujar
2020-08-25  0:59       ` Kuninori Morimoto
2020-08-25  3:11         ` Sameer Pujar
2020-08-25  5:13           ` Kuninori Morimoto
2020-08-25  5:42             ` Sameer Pujar
2020-08-25  6:35               ` Kuninori Morimoto
2020-08-26  6:46                 ` Sameer Pujar
2020-08-27  1:18                   ` Kuninori Morimoto
2020-08-27  1:36                   ` Kuninori Morimoto
2020-09-03 23:51     ` Kuninori Morimoto
2020-09-09 11:33       ` Sameer Pujar
2020-08-21 15:49 ` Pierre-Louis Bossart
2020-10-13  4:50 ` Kuninori Morimoto [this message]
2020-10-15 14:32   ` Mark Brown
2020-10-15 23:04     ` Kuninori Morimoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87imbeybq5.wl-kuninori.morimoto.gx@renesas.com \
    --to=kuninori.morimoto.gx@renesas.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=spujar@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.