All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 00/16] ASoC: Add Rich Graph Card support
@ 2021-09-10  1:20 Kuninori Morimoto
  2021-09-10  1:21 ` [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings Kuninori Morimoto
                   ` (17 more replies)
  0 siblings, 18 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:20 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

We already have Audio-Graph-Card which is Of-Graph base general sound
card driver. Basically it supports basic CPU-Codec connection, and is
also supporting DPCM connection. Because it was forcibly expanded to
DPCM, DT parsing is very limited and very difficult to add new features
on it, for example Multi-CPU/Codec support, Codec2Codec support, etc.

This patch adds more flexible new Rich-Graph-Card driver for it.
Audio-Graph-Card and Rich-Graph-Card are similar, but don't have
full compatibility.
The reason why I need Rich-Graph-Card instead of updating Audio-Graph-Card
is that it is very difficult to keep compatibility.

Rich-Graph-Card supports Normal/DPCM/Codec2Codec Connection wich
Single/Multi DAIs. And it is possible to Customizing.

This patch-set adds Rich-Graph-Card driver and customized driver
sample, and DT settings sample which can be used for testing.

To enable testing/debuging, this patch-set also adds Test-Component
driver. We already have Dummy Component and/or Dummy DAI on soc-utils,
but 1) we can't use it from DT, 2) it do nothing.
Added new Test-Component can be used from DT, and it can indicate called
function name. We can use it to trace callback order, understanding
ALSA SoC behavior, etc, etc...
Sample DT settings of Rich Graph Card is using Test-Component as CPU/Codec DAI.

You can easily try to use/test it if you added below line to your DT file.
Your .config needs to have below CONFIGs to use/test it.
It will probe sample Sound Card which has Normal/DPCM/Multi/Codec2Codec
connections.

	#include "../../../../../sound/soc/generic/rich-graph-card-sample.dtsi"

	CONFIG_SND_RICH_GRAPH_CARD
	CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE
	CONFIG_SND_TEST_COMPONENT

Because Audio Graph Card2 is still under experimental stage, it will
indicate such warning when probing, and the DT might be updated/exchanged.

It can use Codec2Codec, but it will start automatically when probed,
and can't stop it so far. It should be updated.

Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/871r8u4s6q.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/87a6mhwyqn.wl-kuninori.morimoto.gx@renesas.com

v1 -> v2
	- don't use "port" base for_each loop

v2 -> v3
	- Rename audio-graph-card2 to rich-graph-card
	- Rename DSP to DPCM not to confuse
	- Normal/DPCM/Codec2Codec can use Single/Multi DAIs.
	- use dpcm/multi/codec2codec node instead of using extra compatible
	- Sample DTSI patch is separated to Single/Multi.

Kuninori Morimoto (16):
  ASoC: test-component: add Test Component YAML bindings
  ASoC: test-component: add Test Component for Sound debug/test
  ASoC: simple-card-utils: add asoc_graph_is_ports0()
  ASoC: simple-card-utils: add codec2codec support
  ASoC: add Rich Graph Card driver
  ASoC: rich-graph-card: add Multi CPU/Codec support
  ASoC: rich-graph-card: add DPCM support
  ASoC: rich-graph-card: add Codec2Codec support
  ASoC: add Rich Graph Card Yaml Document
  ASoC: add Rich Graph Card Custom Sample
  ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single)
  ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti)
  ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single)
  ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi)
  ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single)
  ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi)

 .../bindings/sound/rich-graph-card.yaml       |   57 +
 .../bindings/sound/test-component.yaml        |   33 +
 include/sound/graph_card.h                    |   21 +
 include/sound/simple_card_utils.h             |    4 +
 sound/soc/generic/Kconfig                     |   20 +
 sound/soc/generic/Makefile                    |    6 +
 sound/soc/generic/rich-custom-card-sample.c   |  174 +++
 sound/soc/generic/rich-graph-card-sample.dtsi |  225 +++
 sound/soc/generic/rich-graph-card.c           | 1277 +++++++++++++++++
 sound/soc/generic/simple-card-utils.c         |   46 +-
 sound/soc/generic/test-component.c            |  659 +++++++++
 11 files changed, 2521 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/sound/rich-graph-card.yaml
 create mode 100644 Documentation/devicetree/bindings/sound/test-component.yaml
 create mode 100644 sound/soc/generic/rich-custom-card-sample.c
 create mode 100644 sound/soc/generic/rich-graph-card-sample.dtsi
 create mode 100644 sound/soc/generic/rich-graph-card.c
 create mode 100644 sound/soc/generic/test-component.c

-- 
2.25.1


^ permalink raw reply	[flat|nested] 33+ messages in thread

* [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
@ 2021-09-10  1:21 ` Kuninori Morimoto
  2021-10-01 20:11   ` Mark Brown
  2021-09-10  1:21 ` [PATCH v3 02/16] ASoC: test-component: add Test Component for Sound debug/test Kuninori Morimoto
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:21 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds test-component sound device YAML bindings.
It can be used for Sound Test/Debug.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 .../bindings/sound/test-component.yaml        | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/test-component.yaml

diff --git a/Documentation/devicetree/bindings/sound/test-component.yaml b/Documentation/devicetree/bindings/sound/test-component.yaml
new file mode 100644
index 000000000000..62a6ecad0e88
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/test-component.yaml
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/test-component.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Test Component Device Tree Bindings
+
+maintainers:
+  - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+
+properties:
+  compatible:
+    enum:
+      - test-cpu
+      - test-cpu-vv
+      - test-cpu-vn
+      - test-cpu-nv
+      - test-codec
+      - test-codec-vv
+      - test-codec-vn
+      - test-codec-nv
+
+required:
+  - compatible
+
+additionalProperties: true
+
+examples:
+  - |
+    test_cpu {
+        compatible = "test-cpu";
+    };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 02/16] ASoC: test-component: add Test Component for Sound debug/test
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
  2021-09-10  1:21 ` [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings Kuninori Morimoto
@ 2021-09-10  1:21 ` Kuninori Morimoto
  2021-09-10  1:21 ` [PATCH v3 03/16] ASoC: simple-card-utils: add asoc_graph_is_ports0() Kuninori Morimoto
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:21 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

We already have dummy-codec, dummy-platform.
But its issues are
	1) we don't have dummy-cpu,
	2) we can't select it via DeviceTree
	3) It do nothing

Sometimes we want to have Dummy Sound Component for debugging,
for testing, for learning Framework behavior, etc, etc...
This patch adds Test-Component driver for it.

User can select CPU   Component by using "test-cpu"   compatible,
and  can select Codec Component by using "test-codec" compatible.

It doesn't support Platform so far, but is easy to add.

We can verbose print to know its progress if user selected
xxx-vn or xxx-nv or xxx-vv compatible driver.

for example,
	test-cpu    : silent  Component, silent  DAI
	test-cpu-vn : verbose Component, silent  DAI
	test-cpu-nv : silent  Component, verbose DAI
	test-cpu-vv : verbose Component, verbose DAI

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/Kconfig          |   6 +
 sound/soc/generic/Makefile         |   2 +
 sound/soc/generic/test-component.c | 659 +++++++++++++++++++++++++++++
 3 files changed, 667 insertions(+)
 create mode 100644 sound/soc/generic/test-component.c

diff --git a/sound/soc/generic/Kconfig b/sound/soc/generic/Kconfig
index 4cafcf0e2bbf..bb734780669e 100644
--- a/sound/soc/generic/Kconfig
+++ b/sound/soc/generic/Kconfig
@@ -17,3 +17,9 @@ config SND_AUDIO_GRAPH_CARD
 	  This option enables generic simple sound card support
 	  with OF-graph DT bindings.
 	  It also support DPCM of multi CPU single Codec ststem.
+
+config SND_TEST_COMPONENT
+	tristate "ASoC Test component sound support"
+	depends on OF
+	help
+	  This option enables test component sound driver support.
diff --git a/sound/soc/generic/Makefile b/sound/soc/generic/Makefile
index 21c29e5e0671..988bfd45d2e2 100644
--- a/sound/soc/generic/Makefile
+++ b/sound/soc/generic/Makefile
@@ -2,7 +2,9 @@
 snd-soc-simple-card-utils-objs	:= simple-card-utils.o
 snd-soc-simple-card-objs	:= simple-card.o
 snd-soc-audio-graph-card-objs	:= audio-graph-card.o
+snd-soc-test-component-objs	:= test-component.o
 
 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)	+= snd-soc-simple-card-utils.o
 obj-$(CONFIG_SND_SIMPLE_CARD)		+= snd-soc-simple-card.o
 obj-$(CONFIG_SND_AUDIO_GRAPH_CARD)	+= snd-soc-audio-graph-card.o
+obj-$(CONFIG_SND_TEST_COMPONENT)	+= snd-soc-test-component.o
diff --git a/sound/soc/generic/test-component.c b/sound/soc/generic/test-component.c
new file mode 100644
index 000000000000..de0f7f2586b4
--- /dev/null
+++ b/sound/soc/generic/test-component.c
@@ -0,0 +1,659 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// test-component.c  --  Test Audio Component driver
+//
+// Copyright (C) 2020 Renesas Electronics Corporation
+// Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+
+#include <linux/slab.h>
+#include <linux/of_device.h>
+#include <linux/of_graph.h>
+#include <linux/module.h>
+#include <linux/workqueue.h>
+#include <sound/pcm.h>
+#include <sound/soc.h>
+
+#define TEST_NAME_LEN 32
+struct test_dai_name {
+	char name[TEST_NAME_LEN];
+	char name_playback[TEST_NAME_LEN];
+	char name_capture[TEST_NAME_LEN];
+};
+
+struct test_priv {
+	struct device *dev;
+	struct snd_pcm_substream *substream;
+	struct delayed_work dwork;
+	struct snd_soc_component_driver *component_driver;
+	struct snd_soc_dai_driver *dai_driver;
+	struct test_dai_name *name;
+};
+
+struct test_adata {
+	u32 is_cpu:1;
+	u32 cmp_v:1;
+	u32 dai_v:1;
+};
+
+#define mile_stone(d)		dev_info((d)->dev, "%s() : %s", __func__, (d)->driver->name)
+#define mile_stone_x(dev)	dev_info(dev, "%s()", __func__)
+
+static int test_dai_set_sysclk(struct snd_soc_dai *dai,
+			       int clk_id, unsigned int freq, int dir)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
+			    unsigned int freq_in, unsigned int freq_out)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
+{
+	unsigned int format = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+	unsigned int clock  = fmt & SND_SOC_DAIFMT_CLOCK_MASK;
+	unsigned int inv    = fmt & SND_SOC_DAIFMT_INV_MASK;
+	unsigned int master = fmt & SND_SOC_DAIFMT_MASTER_MASK;
+	char *str;
+
+	dev_info(dai->dev, "name   : %s", dai->name);
+
+	str = "unknown";
+	switch (format) {
+	case SND_SOC_DAIFMT_I2S:
+		str = "i2s";
+		break;
+	case SND_SOC_DAIFMT_RIGHT_J:
+		str = "right_j";
+		break;
+	case SND_SOC_DAIFMT_LEFT_J:
+		str = "left_j";
+		break;
+	case SND_SOC_DAIFMT_DSP_A:
+		str = "dsp_a";
+		break;
+	case SND_SOC_DAIFMT_DSP_B:
+		str = "dsp_b";
+		break;
+	case SND_SOC_DAIFMT_AC97:
+		str = "ac97";
+		break;
+	case SND_SOC_DAIFMT_PDM:
+		str = "pdm";
+		break;
+	}
+	dev_info(dai->dev, "format : %s", str);
+
+	if (clock == SND_SOC_DAIFMT_CONT)
+		str = "continuous";
+	else
+		str = "gated";
+	dev_info(dai->dev, "clock  : %s", str);
+
+	str = "unknown";
+	switch (master) {
+	case SND_SOC_DAIFMT_CBP_CFP:
+		str = "clk provider, frame provider";
+		break;
+	case SND_SOC_DAIFMT_CBC_CFP:
+		str = "clk consumer, frame provider";
+		break;
+	case SND_SOC_DAIFMT_CBP_CFC:
+		str = "clk provider, frame consumer";
+		break;
+	case SND_SOC_DAIFMT_CBC_CFC:
+		str = "clk consumer, frame consumer";
+		break;
+	}
+	dev_info(dai->dev, "clock  : codec is %s", str);
+
+	str = "unknown";
+	switch (inv) {
+	case SND_SOC_DAIFMT_NB_NF:
+		str = "normal bit, normal frame";
+		break;
+	case SND_SOC_DAIFMT_NB_IF:
+		str = "normal bit, invert frame";
+		break;
+	case SND_SOC_DAIFMT_IB_NF:
+		str = "invert bit, normal frame";
+		break;
+	case SND_SOC_DAIFMT_IB_IF:
+		str = "invert bit, invert frame";
+		break;
+	}
+	dev_info(dai->dev, "signal : %s", str);
+
+	return 0;
+}
+
+static int test_dai_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static void test_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+}
+
+static int test_dai_hw_params(struct snd_pcm_substream *substream,
+			      struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static int test_dai_bespoke_trigger(struct snd_pcm_substream *substream,
+				    int cmd, struct snd_soc_dai *dai)
+{
+	mile_stone(dai);
+
+	return 0;
+}
+
+static u64 test_dai_formats =
+	/*
+	 * Select below from Sound Card, not auto
+	 *	SND_SOC_POSSIBLE_DAIFMT_CBP_CFP
+	 *	SND_SOC_POSSIBLE_DAIFMT_CBC_CFP
+	 *	SND_SOC_POSSIBLE_DAIFMT_CBP_CFC
+	 *	SND_SOC_POSSIBLE_DAIFMT_CBC_CFC
+	 */
+	SND_SOC_POSSIBLE_DAIFMT_I2S	|
+	SND_SOC_POSSIBLE_DAIFMT_RIGHT_J	|
+	SND_SOC_POSSIBLE_DAIFMT_LEFT_J	|
+	SND_SOC_POSSIBLE_DAIFMT_DSP_A	|
+	SND_SOC_POSSIBLE_DAIFMT_DSP_B	|
+	SND_SOC_POSSIBLE_DAIFMT_AC97	|
+	SND_SOC_POSSIBLE_DAIFMT_PDM	|
+	SND_SOC_POSSIBLE_DAIFMT_NB_NF	|
+	SND_SOC_POSSIBLE_DAIFMT_NB_IF	|
+	SND_SOC_POSSIBLE_DAIFMT_IB_NF	|
+	SND_SOC_POSSIBLE_DAIFMT_IB_IF;
+
+static const struct snd_soc_dai_ops test_ops = {
+	.set_fmt		= test_dai_set_fmt,
+	.startup		= test_dai_startup,
+	.shutdown		= test_dai_shutdown,
+	.auto_selectable_formats	= &test_dai_formats,
+	.num_auto_selectable_formats	= 1,
+};
+
+static const struct snd_soc_dai_ops test_verbose_ops = {
+	.set_sysclk		= test_dai_set_sysclk,
+	.set_pll		= test_dai_set_pll,
+	.set_clkdiv		= test_dai_set_clkdiv,
+	.set_fmt		= test_dai_set_fmt,
+	.mute_stream		= test_dai_mute_stream,
+	.startup		= test_dai_startup,
+	.shutdown		= test_dai_shutdown,
+	.hw_params		= test_dai_hw_params,
+	.hw_free		= test_dai_hw_free,
+	.trigger		= test_dai_trigger,
+	.bespoke_trigger	= test_dai_bespoke_trigger,
+	.auto_selectable_formats	= &test_dai_formats,
+	.num_auto_selectable_formats	= 1,
+};
+
+#define STUB_RATES	SNDRV_PCM_RATE_8000_384000
+#define STUB_FORMATS	(SNDRV_PCM_FMTBIT_S8		| \
+			 SNDRV_PCM_FMTBIT_U8		| \
+			 SNDRV_PCM_FMTBIT_S16_LE	| \
+			 SNDRV_PCM_FMTBIT_U16_LE	| \
+			 SNDRV_PCM_FMTBIT_S24_LE	| \
+			 SNDRV_PCM_FMTBIT_S24_3LE	| \
+			 SNDRV_PCM_FMTBIT_U24_LE	| \
+			 SNDRV_PCM_FMTBIT_S32_LE	| \
+			 SNDRV_PCM_FMTBIT_U32_LE)
+
+static int test_component_probe(struct snd_soc_component *component)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static void test_component_remove(struct snd_soc_component *component)
+{
+	mile_stone(component);
+}
+
+static int test_component_suspend(struct snd_soc_component *component)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_resume(struct snd_soc_component *component)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+#define PREALLOC_BUFFER		(32 * 1024)
+static int test_component_pcm_construct(struct snd_soc_component *component,
+					struct snd_soc_pcm_runtime *rtd)
+{
+	mile_stone(component);
+
+	snd_pcm_set_managed_buffer_all(
+		rtd->pcm,
+		SNDRV_DMA_TYPE_DEV,
+		rtd->card->snd_card->dev,
+		PREALLOC_BUFFER, PREALLOC_BUFFER);
+
+	return 0;
+}
+
+static void test_component_pcm_destruct(struct snd_soc_component *component,
+					struct snd_pcm *pcm)
+{
+	mile_stone(component);
+}
+
+static int test_component_set_sysclk(struct snd_soc_component *component,
+				     int clk_id, int source, unsigned int freq, int dir)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_set_pll(struct snd_soc_component *component, int pll_id,
+				  int source, unsigned int freq_in, unsigned int freq_out)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_set_jack(struct snd_soc_component *component,
+				   struct snd_soc_jack *jack,  void *data)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static void test_component_seq_notifier(struct snd_soc_component *component,
+					enum snd_soc_dapm_type type, int subseq)
+{
+	mile_stone(component);
+}
+
+static int test_component_stream_event(struct snd_soc_component *component, int event)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_set_bias_level(struct snd_soc_component *component,
+					 enum snd_soc_bias_level level)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static const struct snd_pcm_hardware test_component_hardware = {
+	/* Random values to keep userspace happy when checking constraints */
+	.info			= SNDRV_PCM_INFO_INTERLEAVED	|
+				  SNDRV_PCM_INFO_MMAP		|
+				  SNDRV_PCM_INFO_MMAP_VALID,
+	.buffer_bytes_max	= 32 * 1024,
+	.period_bytes_min	= 32,
+	.period_bytes_max	= 8192,
+	.periods_min		= 1,
+	.periods_max		= 128,
+	.fifo_size		= 256,
+};
+
+static int test_component_open(struct snd_soc_component *component,
+			       struct snd_pcm_substream *substream)
+{
+	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+
+	mile_stone(component);
+
+	/* BE's dont need dummy params */
+	if (!rtd->dai_link->no_pcm)
+		snd_soc_set_runtime_hwparams(substream, &test_component_hardware);
+
+	return 0;
+}
+
+static int test_component_close(struct snd_soc_component *component,
+				struct snd_pcm_substream *substream)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_ioctl(struct snd_soc_component *component,
+				struct snd_pcm_substream *substream,
+				unsigned int cmd, void *arg)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_hw_params(struct snd_soc_component *component,
+				    struct snd_pcm_substream *substream,
+				    struct snd_pcm_hw_params *params)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_hw_free(struct snd_soc_component *component,
+				  struct snd_pcm_substream *substream)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_prepare(struct snd_soc_component *component,
+				  struct snd_pcm_substream *substream)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static void test_component_timer_stop(struct test_priv *priv)
+{
+	cancel_delayed_work(&priv->dwork);
+}
+
+static void test_component_timer_start(struct test_priv *priv)
+{
+	schedule_delayed_work(&priv->dwork, msecs_to_jiffies(10));
+}
+
+static void test_component_dwork(struct work_struct *work)
+{
+	struct test_priv *priv = container_of(work, struct test_priv, dwork.work);
+
+	if (priv->substream)
+		snd_pcm_period_elapsed(priv->substream);
+
+	test_component_timer_start(priv);
+}
+
+static int test_component_trigger(struct snd_soc_component *component,
+				  struct snd_pcm_substream *substream, int cmd)
+{
+	struct test_priv *priv = dev_get_drvdata(component->dev);
+
+	mile_stone(component);
+
+	switch (cmd) {
+	case SNDRV_PCM_TRIGGER_START:
+		test_component_timer_start(priv);
+		priv->substream = substream; /* set substream later */
+		break;
+	case SNDRV_PCM_TRIGGER_STOP:
+		priv->substream = NULL;
+		test_component_timer_stop(priv);
+	}
+
+	return 0;
+}
+
+static int test_component_sync_stop(struct snd_soc_component *component,
+				    struct snd_pcm_substream *substream)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static snd_pcm_uframes_t test_component_pointer(struct snd_soc_component *component,
+						struct snd_pcm_substream *substream)
+{
+	struct snd_pcm_runtime *runtime = substream->runtime;
+	static int pointer;
+
+	if (!runtime)
+		return 0;
+
+	pointer += 10;
+	if (pointer > PREALLOC_BUFFER)
+		pointer = 0;
+
+	/* mile_stone(component); */
+
+	return bytes_to_frames(runtime, pointer);
+}
+
+static int test_component_get_time_info(struct snd_soc_component *component,
+					struct snd_pcm_substream *substream,
+					struct timespec64 *system_ts,
+					struct timespec64 *audio_ts,
+					struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
+					struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
+{
+	mile_stone(component);
+
+	return 0;
+}
+
+static int test_component_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+					     struct snd_pcm_hw_params *params)
+{
+	mile_stone_x(rtd->dev);
+
+	return 0;
+}
+
+/* CPU */
+static const struct test_adata test_cpu		= { .is_cpu = 1, .cmp_v = 0, .dai_v = 0, };
+static const struct test_adata test_cpu_vv	= { .is_cpu = 1, .cmp_v = 1, .dai_v = 1, };
+static const struct test_adata test_cpu_nv	= { .is_cpu = 1, .cmp_v = 0, .dai_v = 1, };
+static const struct test_adata test_cpu_vn	= { .is_cpu = 1, .cmp_v = 1, .dai_v = 0, };
+/* Codec */
+static const struct test_adata test_codec	= { .is_cpu = 0, .cmp_v = 0, .dai_v = 0, };
+static const struct test_adata test_codec_vv	= { .is_cpu = 0, .cmp_v = 1, .dai_v = 1, };
+static const struct test_adata test_codec_nv	= { .is_cpu = 0, .cmp_v = 0, .dai_v = 1, };
+static const struct test_adata test_codec_vn	= { .is_cpu = 0, .cmp_v = 1, .dai_v = 0, };
+
+static const struct of_device_id test_of_match[] = {
+	{ .compatible = "test-cpu",		.data = (void *)&test_cpu,    },
+	{ .compatible = "test-cpu-vv",		.data = (void *)&test_cpu_vv, },
+	{ .compatible = "test-cpu-vn",		.data = (void *)&test_cpu_vn, },
+	{ .compatible = "test-cpu-nv",		.data = (void *)&test_cpu_nv, },
+	{ .compatible = "test-codec",		.data = (void *)&test_codec,    },
+	{ .compatible = "test-codec-vv",	.data = (void *)&test_codec_vv, },
+	{ .compatible = "test-codec-vn",	.data = (void *)&test_codec_vn, },
+	{ .compatible = "test-codec-nv",	.data = (void *)&test_codec_nv, },
+	{},
+};
+MODULE_DEVICE_TABLE(of, test_of_match);
+
+static const struct snd_soc_dapm_widget widgets[] = {
+	/*
+	 * FIXME
+	 *
+	 * Just IN/OUT is OK for now,
+	 * but need to be updated ?
+	 */
+	SND_SOC_DAPM_INPUT("IN"),
+	SND_SOC_DAPM_OUTPUT("OUT"),
+};
+
+static int test_driver_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *node = dev->of_node;
+	struct device_node *ep;
+	const struct of_device_id *of_id = of_match_device(test_of_match, &pdev->dev);
+	const struct test_adata *adata = of_id->data;
+	struct snd_soc_component_driver *cdriv;
+	struct snd_soc_dai_driver *ddriv;
+	struct test_dai_name *dname;
+	struct test_priv *priv;
+	int num, ret, i;
+
+	num = of_graph_get_endpoint_count(node);
+	if (!num) {
+		dev_err(dev, "no port exits\n");
+		return -EINVAL;
+	}
+
+	priv	= devm_kzalloc(dev, sizeof(*priv),		GFP_KERNEL);
+	cdriv	= devm_kzalloc(dev, sizeof(*cdriv),		GFP_KERNEL);
+	ddriv	= devm_kzalloc(dev, sizeof(*ddriv) * num,	GFP_KERNEL);
+	dname	= devm_kzalloc(dev, sizeof(*dname) * num,	GFP_KERNEL);
+	if (!priv || !cdriv || !ddriv || !dname)
+		return -EINVAL;
+
+	priv->dev		= dev;
+	priv->component_driver	= cdriv;
+	priv->dai_driver	= ddriv;
+	priv->name		= dname;
+
+	INIT_DELAYED_WORK(&priv->dwork, test_component_dwork);
+	dev_set_drvdata(dev, priv);
+
+	if (adata->is_cpu) {
+		cdriv->name			= "test_cpu";
+		cdriv->pcm_construct		= test_component_pcm_construct;
+		cdriv->pointer			= test_component_pointer;
+		cdriv->trigger			= test_component_trigger;
+	} else {
+		cdriv->name			= "test_codec";
+		cdriv->idle_bias_on		= 1;
+		cdriv->endianness		= 1;
+		cdriv->non_legacy_dai_naming	= 1;
+	}
+
+	cdriv->open		= test_component_open;
+	cdriv->dapm_widgets	= widgets;
+	cdriv->num_dapm_widgets	= ARRAY_SIZE(widgets);
+
+	if (adata->cmp_v) {
+		cdriv->probe			= test_component_probe;
+		cdriv->remove			= test_component_remove;
+		cdriv->suspend			= test_component_suspend;
+		cdriv->resume			= test_component_resume;
+		cdriv->set_sysclk		= test_component_set_sysclk;
+		cdriv->set_pll			= test_component_set_pll;
+		cdriv->set_jack			= test_component_set_jack;
+		cdriv->seq_notifier		= test_component_seq_notifier;
+		cdriv->stream_event		= test_component_stream_event;
+		cdriv->set_bias_level		= test_component_set_bias_level;
+		cdriv->close			= test_component_close;
+		cdriv->ioctl			= test_component_ioctl;
+		cdriv->hw_params		= test_component_hw_params;
+		cdriv->hw_free			= test_component_hw_free;
+		cdriv->prepare			= test_component_prepare;
+		cdriv->sync_stop		= test_component_sync_stop;
+		cdriv->get_time_info		= test_component_get_time_info;
+		cdriv->be_hw_params_fixup	= test_component_be_hw_params_fixup;
+
+		if (adata->is_cpu)
+			cdriv->pcm_destruct	= test_component_pcm_destruct;
+	}
+
+	i = 0;
+	for_each_endpoint_of_node(node, ep) {
+		snprintf(dname[i].name, TEST_NAME_LEN, "%s.%d", node->name, i);
+		ddriv[i].name = dname[i].name;
+
+		snprintf(dname[i].name_playback, TEST_NAME_LEN, "DAI%d Playback", i);
+		ddriv[i].playback.stream_name	= dname[i].name_playback;
+		ddriv[i].playback.channels_min	= 1;
+		ddriv[i].playback.channels_max	= 384;
+		ddriv[i].playback.rates		= STUB_RATES;
+		ddriv[i].playback.formats	= STUB_FORMATS;
+
+		snprintf(dname[i].name_capture, TEST_NAME_LEN, "DAI%d Capture", i);
+		ddriv[i].capture.stream_name	= dname[i].name_capture;
+		ddriv[i].capture.channels_min	= 1;
+		ddriv[i].capture.channels_max	= 384;
+		ddriv[i].capture.rates		= STUB_RATES;
+		ddriv[i].capture.formats	= STUB_FORMATS;
+
+		if (adata->dai_v)
+			ddriv[i].ops = &test_verbose_ops;
+		else
+			ddriv[i].ops = &test_ops;
+
+		i++;
+	}
+
+	ret = devm_snd_soc_register_component(dev, cdriv, ddriv, num);
+	if (ret < 0)
+		return ret;
+
+	mile_stone_x(dev);
+
+	return 0;
+}
+
+static int test_driver_remove(struct platform_device *pdev)
+{
+	mile_stone_x(&pdev->dev);
+
+	return 0;
+}
+
+static struct platform_driver test_driver = {
+	.driver = {
+		.name = "test-component",
+		.of_match_table = test_of_match,
+	},
+	.probe  = test_driver_probe,
+	.remove = test_driver_remove,
+};
+module_platform_driver(test_driver);
+
+MODULE_ALIAS("platform:asoc-test-component");
+MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
+MODULE_DESCRIPTION("ASoC Test Component");
+MODULE_LICENSE("GPL v2");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 03/16] ASoC: simple-card-utils: add asoc_graph_is_ports0()
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
  2021-09-10  1:21 ` [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings Kuninori Morimoto
  2021-09-10  1:21 ` [PATCH v3 02/16] ASoC: test-component: add Test Component for Sound debug/test Kuninori Morimoto
@ 2021-09-10  1:21 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 04/16] ASoC: simple-card-utils: add codec2codec support Kuninori Morimoto
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:21 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

rich-graph-card will support DPCM/Multi/Codec2Codec,
and these will use almost same DT settings which uses
ports0 and ports1.
This patch adds asoc_graph_is_ports0() which checks
port is under port0 or not.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/simple_card_utils.h     |  1 +
 sound/soc/generic/simple-card-utils.c | 28 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index 51b3b485a92e..520559b0a336 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -180,6 +180,7 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 int asoc_simple_remove(struct platform_device *pdev);
 
 int asoc_graph_card_probe(struct snd_soc_card *card);
+int asoc_graph_is_ports0(struct device_node *port);
 
 #ifdef DEBUG
 static inline void asoc_simple_debug_dai(struct asoc_simple_priv *priv,
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 437a0e2ee113..22d4bdb7383b 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -759,6 +759,34 @@ int asoc_graph_card_probe(struct snd_soc_card *card)
 }
 EXPORT_SYMBOL_GPL(asoc_graph_card_probe);
 
+int asoc_graph_is_ports0(struct device_node *np)
+{
+	struct device_node *port, *ports, *ports0, *top;
+	int ret;
+
+	/* np is "endpoint" or "port" */
+	if (of_node_name_eq(np, "endpoint")) {
+		port = of_get_parent(np);
+	} else {
+		port = np;
+		of_node_get(port);
+	}
+
+	ports	= of_get_parent(port);
+	top	= of_get_parent(ports);
+	ports0	= of_get_child_by_name(top, "ports");
+
+	ret = ports0 == ports;
+
+	of_node_put(port);
+	of_node_put(ports);
+	of_node_put(ports0);
+	of_node_put(top);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(asoc_graph_is_ports0);
+
 /* Module information */
 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
 MODULE_DESCRIPTION("ALSA SoC Simple Card Utils");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 04/16] ASoC: simple-card-utils: add codec2codec support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (2 preceding siblings ...)
  2021-09-10  1:21 ` [PATCH v3 03/16] ASoC: simple-card-utils: add asoc_graph_is_ports0() Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 05/16] ASoC: add Rich Graph Card driver Kuninori Morimoto
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

codec2codec needs snd_soc_pcm_stream settings.
This patch adds it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/simple_card_utils.h     |  3 +++
 sound/soc/generic/simple-card-utils.c | 18 +++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index 520559b0a336..51f287220348 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -42,6 +42,7 @@ struct prop_nums {
 	int cpus;
 	int codecs;
 	int platforms;
+	int c2c;
 };
 
 struct asoc_simple_priv {
@@ -54,6 +55,7 @@ struct asoc_simple_priv {
 		struct snd_soc_dai_link_component *platforms;
 		struct asoc_simple_data adata;
 		struct snd_soc_codec_conf *codec_conf;
+		struct snd_soc_pcm_stream *c2c_conf;
 		struct prop_nums num;
 		unsigned int mclk_fs;
 	} *dai_props;
@@ -64,6 +66,7 @@ struct asoc_simple_priv {
 	struct snd_soc_dai_link_component *dlcs;
 	struct snd_soc_dai_link_component dummy;
 	struct snd_soc_codec_conf *codec_conf;
+	struct snd_soc_pcm_stream *c2c_conf;
 	struct gpio_desc *pa_gpio;
 	const struct snd_soc_ops *ops;
 	unsigned int dpcm_selectable:1;
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 22d4bdb7383b..850e968677f1 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -619,7 +619,8 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 	struct asoc_simple_dai *dais;
 	struct snd_soc_dai_link_component *dlcs;
 	struct snd_soc_codec_conf *cconf = NULL;
-	int i, dai_num = 0, dlc_num = 0, cnf_num = 0;
+	struct snd_soc_pcm_stream *c2c_conf = NULL;
+	int i, dai_num = 0, dlc_num = 0, cnf_num = 0, c2c_num = 0;
 
 	dai_props = devm_kcalloc(dev, li->link, sizeof(*dai_props), GFP_KERNEL);
 	dai_link  = devm_kcalloc(dev, li->link, sizeof(*dai_link),  GFP_KERNEL);
@@ -638,6 +639,8 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 
 		if (!li->num[i].cpus)
 			cnf_num += li->num[i].codecs;
+
+		c2c_num += li->num[i].c2c;
 	}
 
 	dais = devm_kcalloc(dev, dai_num, sizeof(*dais), GFP_KERNEL);
@@ -651,6 +654,12 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 			return -ENOMEM;
 	}
 
+	if (c2c_num) {
+		c2c_conf = devm_kcalloc(dev, c2c_num, sizeof(*c2c_conf), GFP_KERNEL);
+		if (!c2c_conf)
+			return -ENOMEM;
+	}
+
 	dev_dbg(dev, "link %d, dais %d, ccnf %d\n",
 		li->link, dai_num, cnf_num);
 
@@ -664,6 +673,7 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 	priv->dais		= dais;
 	priv->dlcs		= dlcs;
 	priv->codec_conf	= cconf;
+	priv->c2c_conf		= c2c_conf;
 
 	card->dai_link		= priv->dai_link;
 	card->num_links		= li->link;
@@ -681,6 +691,12 @@ int asoc_simple_init_priv(struct asoc_simple_priv *priv,
 
 			dlcs += li->num[i].cpus;
 			dais += li->num[i].cpus;
+
+			if (li->num[i].c2c) {
+				/* Codec2Codec */
+				dai_props[i].c2c_conf = c2c_conf;
+				c2c_conf += li->num[i].c2c;
+			}
 		} else {
 			/* DPCM Be's CPU = dummy */
 			dai_props[i].cpus	=
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 05/16] ASoC: add Rich Graph Card driver
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (3 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 04/16] ASoC: simple-card-utils: add codec2codec support Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-12 10:24     ` kernel test robot
  2021-09-10  1:22 ` [PATCH v3 06/16] ASoC: rich-graph-card: add Multi CPU/Codec support Kuninori Morimoto
                   ` (12 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

We already have audio-graph-card which is Of-graph base of general
sound card driver.

It is supporting DPCM connection, but was forcibly expanded.
Thus, it is very difficult to add new features on it, for example
Multi CPU/Codec support, Codec2Codec support, etc.

This patch adds more flexible new Rich Graph Card driver for it.
audio-graph-card and rich-graph-card are similar, but don't have
full compatibility.

Rich Graph Card supports very generic connection, but some users
want to have its own settings, for example PLL settings, etc.
For such case, it has customizing support.
In users own driver, it can use Rich Graph Card parsing by using
rich_graph_parse_of(), and doing its own customizing.

Because Rich Graph Card is still under experimental stage,
it will indicate such warning when probing, and the DT syntax
might be changed.

Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/graph_card.h          |  15 +
 sound/soc/generic/Kconfig           |   8 +
 sound/soc/generic/Makefile          |   2 +
 sound/soc/generic/rich-graph-card.c | 669 ++++++++++++++++++++++++++++
 4 files changed, 694 insertions(+)
 create mode 100644 sound/soc/generic/rich-graph-card.c

diff --git a/include/sound/graph_card.h b/include/sound/graph_card.h
index 6f10bfb0d5ee..7a22513146c0 100644
--- a/include/sound/graph_card.h
+++ b/include/sound/graph_card.h
@@ -9,6 +9,21 @@
 
 #include <sound/simple_card_utils.h>
 
+typedef int (*GRAPH_CUSTOM)(struct asoc_simple_priv *priv,
+			    struct device_node *lnk,
+			    struct link_info *li);
+
+struct graph_custom_hooks {
+	int (*hook_pre)(struct asoc_simple_priv *priv);
+	int (*hook_post)(struct asoc_simple_priv *priv);
+	GRAPH_CUSTOM custom_normal;
+};
+
 int audio_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev);
+int rich_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev,
+			struct graph_custom_hooks *hooks);
+
+int rich_graph_link_normal(struct asoc_simple_priv *priv,
+			   struct device_node *lnk, struct link_info *li);
 
 #endif /* __GRAPH_CARD_H */
diff --git a/sound/soc/generic/Kconfig b/sound/soc/generic/Kconfig
index bb734780669e..8af35415d162 100644
--- a/sound/soc/generic/Kconfig
+++ b/sound/soc/generic/Kconfig
@@ -18,6 +18,14 @@ config SND_AUDIO_GRAPH_CARD
 	  with OF-graph DT bindings.
 	  It also support DPCM of multi CPU single Codec ststem.
 
+config SND_RICH_GRAPH_CARD
+	tristate "ASoC Rich Graph Card support"
+	depends on OF
+	select SND_SIMPLE_CARD_UTILS
+	help
+	  This option enables generic rich graph card support
+	  with OF-graph DT bindings.
+
 config SND_TEST_COMPONENT
 	tristate "ASoC Test component sound support"
 	depends on OF
diff --git a/sound/soc/generic/Makefile b/sound/soc/generic/Makefile
index 988bfd45d2e2..60a2e90a4a6b 100644
--- a/sound/soc/generic/Makefile
+++ b/sound/soc/generic/Makefile
@@ -2,9 +2,11 @@
 snd-soc-simple-card-utils-objs	:= simple-card-utils.o
 snd-soc-simple-card-objs	:= simple-card.o
 snd-soc-audio-graph-card-objs	:= audio-graph-card.o
+snd-soc-rich-graph-card-objs	:= rich-graph-card.o
 snd-soc-test-component-objs	:= test-component.o
 
 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)	+= snd-soc-simple-card-utils.o
 obj-$(CONFIG_SND_SIMPLE_CARD)		+= snd-soc-simple-card.o
 obj-$(CONFIG_SND_AUDIO_GRAPH_CARD)	+= snd-soc-audio-graph-card.o
+obj-$(CONFIG_SND_RICH_GRAPH_CARD)	+= snd-soc-rich-graph-card.o
 obj-$(CONFIG_SND_TEST_COMPONENT)	+= snd-soc-test-component.o
diff --git a/sound/soc/generic/rich-graph-card.c b/sound/soc/generic/rich-graph-card.c
new file mode 100644
index 000000000000..a01a7c575622
--- /dev/null
+++ b/sound/soc/generic/rich-graph-card.c
@@ -0,0 +1,669 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// ASoC Rich Graph Card support
+//
+// Copyright (C) 2020 Renesas Electronics Corp.
+// Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+//
+// based on ${LINUX}/sound/soc/generic/audio-graph-card.c
+#include <linux/clk.h>
+#include <linux/device.h>
+#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
+#include <linux/of_graph.h>
+#include <linux/platform_device.h>
+#include <linux/string.h>
+#include <sound/graph_card.h>
+
+/************************************
+	daifmt
+ ************************************
+	ports {
+		format = "left_j";
+		port@0 {
+			bitclock-master;
+			sample0: endpoint@0 {
+				frame-master;
+			};
+			sample1: endpoint@1 {
+				format = "i2s";
+			};
+		};
+		...
+	};
+
+ You can set daifmt at ports/port/endpoint.
+ It uses *latest* format, and *share* master settings.
+ In above case,
+	sample0: left_j, bitclock-master, frame-master
+	sample1: i2s,    bitclock-master
+
+ If there was no settings, *Codec* will be
+ bitclock/frame provider as default.
+ see
+	graph_parse_daifmt().
+
+ ************************************
+	Normal Audio-Graph
+ ************************************
+
+ CPU <---> Codec
+
+ sound {
+	compatible = "rich-graph-card";
+	links = <&cpu>;
+ };
+
+ CPU {
+	cpu: port {
+		bitclock-master;
+		frame-master;
+		cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
+ };
+
+ Codec {
+	port {	codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
+ };
+
+*/
+
+enum graph_type {
+	GRAPH_NORMAL,
+};
+
+#define port_to_endpoint(port) of_get_child_by_name(port, "endpoint")
+
+static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
+				      struct device_node *lnk)
+{
+	enum graph_type type = GRAPH_NORMAL;
+
+#ifdef DEBUG
+	{
+		struct device *dev = simple_priv_to_dev(priv);
+		const char *str = "Normal";
+
+		dev_dbg(dev, "%pOF (%s)", lnk, str);
+	}
+#endif
+	return type;
+}
+
+static const struct snd_soc_ops graph_ops = {
+	.startup	= asoc_simple_startup,
+	.shutdown	= asoc_simple_shutdown,
+	.hw_params	= asoc_simple_hw_params,
+};
+
+static int graph_get_dai_id(struct device_node *ep)
+{
+	struct device_node *node;
+	struct device_node *endpoint;
+	struct of_endpoint info;
+	int i, id;
+	const u32 *reg;
+	int ret;
+
+	/* use driver specified DAI ID if exist */
+	ret = snd_soc_get_dai_id(ep);
+	if (ret != -ENOTSUPP)
+		return ret;
+
+	/* use endpoint/port reg if exist */
+	ret = of_graph_parse_endpoint(ep, &info);
+	if (ret == 0) {
+		/*
+		 * Because it will count port/endpoint if it doesn't have "reg".
+		 * But, we can't judge whether it has "no reg", or "reg = <0>"
+		 * only of_graph_parse_endpoint().
+		 * We need to check "reg" property
+		 */
+		if (of_get_property(ep,   "reg", NULL))
+			return info.id;
+
+		node = of_get_parent(ep);
+		reg = of_get_property(node, "reg", NULL);
+		of_node_put(node);
+		if (reg)
+			return info.port;
+	}
+	node = of_graph_get_port_parent(ep);
+
+	/*
+	 * Non HDMI sound case, counting port/endpoint on its DT
+	 * is enough. Let's count it.
+	 */
+	i = 0;
+	id = -1;
+	for_each_endpoint_of_node(node, endpoint) {
+		if (endpoint == ep)
+			id = i;
+		i++;
+	}
+
+	of_node_put(node);
+
+	if (id < 0)
+		return -ENODEV;
+
+	return id;
+}
+
+static int asoc_simple_parse_dai(struct device_node *ep,
+				 struct snd_soc_dai_link_component *dlc,
+				 int *is_single_link)
+{
+	struct device_node *node;
+	struct of_phandle_args args;
+	int ret;
+
+	if (!ep)
+		return 0;
+
+	node = of_graph_get_port_parent(ep);
+
+	/* Get dai->name */
+	args.np		= node;
+	args.args[0]	= graph_get_dai_id(ep);
+	args.args_count	= (of_graph_get_endpoint_count(node) > 1);
+
+	/*
+	 * FIXME
+	 *
+	 * Here, dlc->dai_name is pointer to CPU/Codec DAI name.
+	 * If user unbinded CPU or Codec driver, but not for Sound Card,
+	 * dlc->dai_name is keeping unbinded CPU or Codec
+	 * driver's pointer.
+	 *
+	 * If user re-bind CPU or Codec driver again, ALSA SoC will try
+	 * to rebind Card via snd_soc_try_rebind_card(), but because of
+	 * above reason, it might can't bind Sound Card.
+	 * Because Sound Card is pointing to released dai_name pointer.
+	 *
+	 * To avoid this rebind Card issue,
+	 * 1) It needs to alloc memory to keep dai_name eventhough
+	 *    CPU or Codec driver was unbinded, or
+	 * 2) user need to rebind Sound Card everytime
+	 *    if he unbinded CPU or Codec.
+	 */
+	ret = snd_soc_get_dai_name(&args, &dlc->dai_name);
+	if (ret < 0)
+		return ret;
+
+	dlc->of_node = node;
+
+	if (is_single_link)
+		*is_single_link = of_graph_get_endpoint_count(node) == 1;
+
+	return 0;
+}
+
+static void graph_parse_mclk_fs(struct device_node *ep,
+				struct simple_dai_props *props)
+{
+	struct device_node *port	= of_get_parent(ep);
+	struct device_node *ports	= of_get_parent(port);
+
+	if (of_node_name_eq(ports, "ports"))
+		of_property_read_u32(ports, "mclk-fs", &props->mclk_fs);
+	of_property_read_u32(port,	"mclk-fs", &props->mclk_fs);
+	of_property_read_u32(ep,	"mclk-fs", &props->mclk_fs);
+
+	of_node_put(port);
+	of_node_put(ports);
+}
+
+static int __graph_parse_node(struct asoc_simple_priv *priv,
+			      enum graph_type gtype,
+			      struct device_node *ep,
+			      struct link_info *li,
+			      int is_cpu, int idx)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+	struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
+	struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
+	struct snd_soc_dai_link_component *dlc;
+	struct asoc_simple_dai *dai;
+	int ret, is_single_links = 0;
+
+	if (is_cpu) {
+		dlc = asoc_link_to_cpu(dai_link, idx);
+		dai = simple_props_to_dai_cpu(dai_props, idx);
+	} else {
+		dlc = asoc_link_to_codec(dai_link, idx);
+		dai = simple_props_to_dai_codec(dai_props, idx);
+	}
+
+	graph_parse_mclk_fs(ep, dai_props);
+
+	ret = asoc_simple_parse_dai(ep, dlc, &is_single_links);
+	if (ret < 0)
+		return ret;
+
+	ret = asoc_simple_parse_tdm(ep, dai);
+	if (ret < 0)
+		return ret;
+
+	ret = asoc_simple_parse_clk(dev, ep, dai, dlc);
+	if (ret < 0)
+		return ret;
+
+	/*
+	 * set DAI Name
+	 */
+	if (!dai_link->name) {
+		struct snd_soc_dai_link_component *cpus = dlc;
+		struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, idx);
+
+		switch (gtype) {
+		case GRAPH_NORMAL:
+			/* run is_cpu only. see rich_graph_link_normal() */
+			if (is_cpu)
+				asoc_simple_set_dailink_name(dev, dai_link, "%s-%s",
+							     cpus->dai_name, codecs->dai_name);
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (is_cpu) {
+		struct snd_soc_dai_link_component *cpus = dlc;
+		struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, idx);
+
+		asoc_simple_canonicalize_cpu(cpus, is_single_links);
+		asoc_simple_canonicalize_platform(platforms, cpus);
+	}
+
+	return 0;
+}
+
+static int graph_parse_node(struct asoc_simple_priv *priv,
+			    enum graph_type gtype,
+			    struct device_node *port,
+			    struct link_info *li, int is_cpu)
+{
+	struct device_node *ep = port_to_endpoint(port);
+
+	/* Need Multi support later */
+	return __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
+}
+
+static void graph_parse_daifmt(struct device_node *node,
+			       unsigned int *daifmt, unsigned int *bit_frame)
+{
+	unsigned int fmt;
+
+	/*
+	 * see also above "daifmt" explanation
+	 * and samples.
+	 */
+
+	/*
+	 *	ports {
+	 * (A)
+	 *		port {
+	 * (B)
+	 *			endpoint {
+	 * (C)
+	 *			};
+	 *		};
+	 *	};
+	 * };
+	 */
+
+	/*
+	 * clock_provider:
+	 *
+	 * It can be judged it is provider
+	 * if (A) or (B) or (C) has bitclock-master / frame-master flag.
+	 *
+	 * use "or"
+	 */
+	*bit_frame |= snd_soc_daifmt_parse_clock_provider_as_bitmap(node, NULL);
+
+#define update_daifmt(name)					\
+	if (!(*daifmt & SND_SOC_DAIFMT_##name##_MASK) &&	\
+		 (fmt & SND_SOC_DAIFMT_##name##_MASK))		\
+		*daifmt |= fmt & SND_SOC_DAIFMT_##name##_MASK;
+
+	/*
+	 * format
+	 *
+	 * This function is called by (C) -> (B) -> (A) order.
+	 * Set if applicable part was not yet set.
+	 */
+	fmt = snd_soc_daifmt_parse_format(node, NULL);
+	update_daifmt(FORMAT);
+	update_daifmt(CLOCK);
+	update_daifmt(INV);
+}
+
+static void graph_link_init(struct asoc_simple_priv *priv,
+			    struct device_node *port,
+			    struct link_info *li,
+			    int is_cpu_node)
+{
+	struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
+	struct device_node *ep;
+	struct device_node *ports;
+	unsigned int daifmt = 0, daiclk = 0;
+	unsigned int bit_frame = 0;
+
+	/* Need Multi support later */
+	ep = port_to_endpoint(port);
+	ports = of_get_parent(port);
+
+	/*
+	 *	ports {
+	 * (A)
+	 *		port {
+	 * (B)
+	 *			endpoint {
+	 * (C)
+	 *			};
+	 *		};
+	 *	};
+	 * };
+	 */
+	graph_parse_daifmt(ep,    &daifmt, &bit_frame);		/* (C) */
+	graph_parse_daifmt(port,  &daifmt, &bit_frame);		/* (B) */
+	if (of_node_name_eq(ports, "ports"))
+		graph_parse_daifmt(ports, &daifmt, &bit_frame);	/* (A) */
+
+	/*
+	 * convert bit_frame
+	 * We need to flip clock_provider if it was CPU node,
+	 * because it is Codec base.
+	 */
+	daiclk = snd_soc_daifmt_clock_provider_from_bitmap(bit_frame);
+	if (is_cpu_node)
+		daiclk = snd_soc_daifmt_clock_provider_fliped(daiclk);
+
+	dai_link->dai_fmt	= daifmt | daiclk;
+	dai_link->init		= asoc_simple_dai_init;
+	dai_link->ops		= &graph_ops;
+	if (priv->ops)
+		dai_link->ops	= priv->ops;
+}
+
+int rich_graph_link_normal(struct asoc_simple_priv *priv,
+			   struct device_node *lnk,
+			   struct link_info *li)
+{
+	struct device_node *cpu_port = lnk;
+	struct device_node *cpu_ep = port_to_endpoint(cpu_port);
+	struct device_node *codec_port = of_graph_get_remote_port(cpu_ep);
+	int ret;
+
+	/*
+	 * call Codec first.
+	 * see
+	 *	__graph_parse_node() :: DAI Naming
+	 */
+	ret = graph_parse_node(priv, GRAPH_NORMAL, codec_port, li, 0);
+	if (ret < 0)
+		goto err;
+
+	/*
+	 * call CPU, and set DAI Name
+	 */
+	ret = graph_parse_node(priv, GRAPH_NORMAL, cpu_port, li, 1);
+	if (ret < 0)
+		goto err;
+
+	graph_link_init(priv, cpu_port, li, 1);
+err:
+	of_node_put(codec_port);
+	of_node_put(cpu_ep);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(rich_graph_link_normal);
+
+static int graph_link(struct asoc_simple_priv *priv,
+		      struct graph_custom_hooks *hooks,
+		      enum graph_type gtype,
+		      struct device_node *lnk,
+		      struct link_info *li)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+	GRAPH_CUSTOM func = NULL;
+	int ret = -EINVAL;
+
+	switch (gtype) {
+	case GRAPH_NORMAL:
+		if (hooks && hooks->custom_normal)
+			func = hooks->custom_normal;
+		else
+			func = rich_graph_link_normal;
+		break;
+	default:
+		break;
+	}
+
+	if (!func) {
+		dev_err(dev, "non supported gtype (%d)\n", gtype);
+		goto err;
+	}
+
+	ret = func(priv, lnk, li);
+	if (ret < 0)
+		goto err;
+
+	li->link++;
+err:
+	return ret;
+}
+
+static int graph_counter(struct device_node *lnk)
+{
+	/* Need Multi support later */
+	return 1;
+}
+
+static int graph_count_normal(struct asoc_simple_priv *priv,
+			      struct device_node *lnk,
+			      struct link_info *li)
+{
+	struct device_node *cpu_port = lnk;
+	struct device_node *cpu_ep = port_to_endpoint(cpu_port);
+	struct device_node *codec_port = of_graph_get_remote_port(cpu_ep);
+
+	/*
+	 *	CPU {
+	 * =>		lnk: port { endpoint { .. }; };
+	 *	};
+	 */
+	li->num[li->link].cpus		=
+	li->num[li->link].platforms	= graph_counter(cpu_port);
+	li->num[li->link].codecs	= graph_counter(codec_port);
+
+	of_node_put(cpu_ep);
+	of_node_put(codec_port);
+
+	return 0;
+}
+
+static int graph_count(struct asoc_simple_priv *priv,
+		       struct graph_custom_hooks *hooks,
+		       enum graph_type gtype,
+		       struct device_node *lnk,
+		       struct link_info *li)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+	GRAPH_CUSTOM func = NULL;
+	int ret = -EINVAL;
+
+	if (li->link >= SNDRV_MAX_LINKS) {
+		dev_err(dev, "too many links\n");
+		return ret;
+	}
+
+	switch (gtype) {
+	case GRAPH_NORMAL:
+		func = graph_count_normal;
+		break;
+	default:
+	}
+
+	if (!func) {
+		dev_err(dev, "non supported gtype (%d)\n", gtype);
+		goto err;
+	}
+
+	ret = func(priv, lnk, li);
+	if (ret < 0)
+		goto err;
+
+	li->link++;
+err:
+	return ret;
+}
+
+static int graph_for_each_link(struct asoc_simple_priv *priv,
+			       struct graph_custom_hooks *hooks,
+			       struct link_info *li,
+			       int (*func)(struct asoc_simple_priv *priv,
+					   struct graph_custom_hooks *hooks,
+					   enum graph_type gtype,
+					   struct device_node *lnk,
+					   struct link_info *li))
+{
+	struct of_phandle_iterator it;
+	struct device *dev = simple_priv_to_dev(priv);
+	struct device_node *node = dev->of_node;
+	struct device_node *lnk;
+	enum graph_type gtype;
+	int rc, ret;
+
+	/* loop for all listed CPU port */
+	of_for_each_phandle(&it, rc, node, "links", NULL, 0) {
+		lnk = it.node;
+
+		gtype = graph_get_type(priv, lnk);
+
+		ret = func(priv, hooks, gtype, lnk, li);
+		if (ret < 0)
+			return ret;
+	}
+
+	return 0;
+}
+
+int rich_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev,
+			struct graph_custom_hooks *hooks)
+{
+	struct snd_soc_card *card = simple_priv_to_card(priv);
+	struct link_info *li;
+	int ret;
+
+	dev_warn(dev, "Audio Graph Card2 is still under Experimental stage\n");
+
+	li = devm_kzalloc(dev, sizeof(*li), GFP_KERNEL);
+	if (!li)
+		return -ENOMEM;
+
+	card->probe	= asoc_graph_card_probe;
+	card->owner	= THIS_MODULE;
+	card->dev	= dev;
+
+	if ((hooks) && (hooks)->hook_pre) {
+		ret = (hooks)->hook_pre(priv);
+		if (ret < 0)
+			goto err;
+	}
+
+	ret = graph_for_each_link(priv, hooks, li, graph_count);
+	if (!li->link)
+		ret = -EINVAL;
+	if (ret < 0)
+		goto err;
+
+	ret = asoc_simple_init_priv(priv, li);
+	if (ret < 0)
+		goto err;
+
+	priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
+	if (IS_ERR(priv->pa_gpio)) {
+		ret = PTR_ERR(priv->pa_gpio);
+		dev_err(dev, "failed to get amplifier gpio: %d\n", ret);
+		goto err;
+	}
+
+	ret = asoc_simple_parse_widgets(card, NULL);
+	if (ret < 0)
+		goto err;
+
+	ret = asoc_simple_parse_routing(card, NULL);
+	if (ret < 0)
+		goto err;
+
+	memset(li, 0, sizeof(*li));
+	ret = graph_for_each_link(priv, hooks, li, graph_link);
+	if (ret < 0)
+		goto err;
+
+	ret = asoc_simple_parse_card_name(card, NULL);
+	if (ret < 0)
+		goto err;
+
+	snd_soc_card_set_drvdata(card, priv);
+
+	if ((hooks) && (hooks)->hook_post) {
+		ret = (hooks)->hook_post(priv);
+		if (ret < 0)
+			goto err;
+	}
+
+	asoc_simple_debug_info(priv);
+
+	ret = devm_snd_soc_register_card(dev, card);
+err:
+	devm_kfree(dev, li);
+
+	if ((ret < 0) && (ret != -EPROBE_DEFER))
+		dev_err(dev, "parse error %d\n", ret);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(rich_graph_parse_of);
+
+static int graph_probe(struct platform_device *pdev)
+{
+	struct asoc_simple_priv *priv;
+	struct device *dev = &pdev->dev;
+
+	/* Allocate the private data and the DAI link array */
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	return rich_graph_parse_of(priv, dev, NULL);
+}
+
+static const struct of_device_id graph_of_match[] = {
+	{ .compatible = "rich-graph-card", },
+	{},
+};
+MODULE_DEVICE_TABLE(of, graph_of_match);
+
+static struct platform_driver graph_card = {
+	.driver = {
+		.name = "asoc-rich-graph-card",
+		.pm = &snd_soc_pm_ops,
+		.of_match_table = graph_of_match,
+	},
+	.probe	= graph_probe,
+	.remove	= asoc_simple_remove,
+};
+module_platform_driver(graph_card);
+
+MODULE_ALIAS("platform:asoc-rich-graph-card");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("ASoC Rich Graph Card");
+MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 06/16] ASoC: rich-graph-card: add Multi CPU/Codec support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (4 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 05/16] ASoC: add Rich Graph Card driver Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 07/16] ASoC: rich-graph-card: add DPCM support Kuninori Morimoto
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Multi CPU/Codec support to rich-graph-card.
Multi CPU/Codec will have connection part (= X) and CPU/Codec list part (= y).
links indicates connection part of CPU side (= A).

		    +-+   (A)	     +-+
	 CPU1 --(y) | | <-(X)--(X)-> | | (y)-- Codec1
	 CPU2 --(y) | |		     | | (y)-- Codec2
		    +-+		     +-+

	sound {
		compatible = "rich-graph-card";

(A)		links = <&mcpu>;

		multi {
			ports@0 {
(X) (A)			mcpu:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
(y)				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
(y)				port@1 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>; }; };
			};
			ports@1 {
(X)				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>; }; };
(y)				port@0 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
(y)				port@1 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
			};
		};
	};

	CPU {
		ports {
			bitclock-master;
			frame-master;
			port@0 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
			port@1 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
		};
	};

	Codec {
		ports {
			port@0 { codec1_ep: endpoint { remote-endpoint = <&mcodec1_ep>; }; };
			port@1 { codec2_ep: endpoint { remote-endpoint = <&mcodec2_ep>; }; };
		};
	};

Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
Link: https://lore.kernel.org/r/20210804171748.GC26252@sirena.org.uk
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card.c | 196 ++++++++++++++++++++++++++--
 1 file changed, 186 insertions(+), 10 deletions(-)

diff --git a/sound/soc/generic/rich-graph-card.c b/sound/soc/generic/rich-graph-card.c
index a01a7c575622..6ce7001fab2e 100644
--- a/sound/soc/generic/rich-graph-card.c
+++ b/sound/soc/generic/rich-graph-card.c
@@ -69,18 +69,95 @@
 	port {	codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
  };
 
+ ************************************
+	Multi-CPU/Codec
+ ************************************
+
+It has connection part (= X) and list part (= y).
+links indicates connection part of CPU side (= A).
+
+	    +-+   (A)	     +-+
+ CPU1 --(y) | | <-(X)--(X)-> | | (y)-- Codec1
+ CPU2 --(y) | |		     | | (y)-- Codec2
+	    +-+		     +-+
+
+	sound {
+		compatible = "rich-graph-card";
+
+(A)		links = <&mcpu>;
+
+		multi {
+			ports@0 {
+(X) (A)			mcpu:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
+(y)				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>; }; };
+(y)				port@1 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>; }; };
+			};
+			ports@1 {
+(X)				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>; }; };
+(y)				port@0 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
+(y)				port@1 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
+			};
+		};
+	};
+
+ CPU {
+	ports {
+		bitclock-master;
+		frame-master;
+		port@0 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
+		port@1 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
+	};
+ };
+
+ Codec {
+	ports {
+		port@0 { codec1_ep: endpoint { remote-endpoint = <&mcodec1_ep>; }; };
+		port@1 { codec2_ep: endpoint { remote-endpoint = <&mcodec2_ep>; }; };
+	};
+ };
+
 */
 
 enum graph_type {
 	GRAPH_NORMAL,
+
+	GRAPH_MULTI,	/* don't use ! Use this only in __graph_get_type() */
 };
 
+#define GRAPH_NODENAME_MULTI	"multi"
+
 #define port_to_endpoint(port) of_get_child_by_name(port, "endpoint")
 
+static enum graph_type __graph_get_type(struct device_node *lnk)
+{
+	struct device_node *np;
+
+	/*
+	 * target {
+	 *	ports {
+	 * =>		lnk:	port@0 { ... };
+	 *			port@1 { ... };
+	 *	};
+	 * };
+	 */
+	np = of_get_parent(lnk);
+	if (of_node_name_eq(np, "ports"))
+		np = of_get_parent(np);
+
+	if (of_node_name_eq(np, GRAPH_NODENAME_MULTI))
+		return GRAPH_MULTI;
+
+	return GRAPH_NORMAL;
+}
+
 static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
 				      struct device_node *lnk)
 {
-	enum graph_type type = GRAPH_NORMAL;
+	enum graph_type type = __graph_get_type(lnk);
+
+	/* GRAPH_MULTI here means GRAPH_NORMAL */
+	if (type == GRAPH_MULTI)
+		type = GRAPH_NORMAL;
 
 #ifdef DEBUG
 	{
@@ -93,6 +170,49 @@ static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
 	return type;
 }
 
+static int graph_lnk_is_multi(struct device_node *lnk)
+{
+	return __graph_get_type(lnk) == GRAPH_MULTI;
+}
+
+static struct device_node *graph_get_next_multi_ep(struct device_node **port)
+{
+	struct device_node *ports = of_get_parent(*port);
+	struct device_node *ep = NULL;
+	struct device_node *rep = NULL;
+
+	/*
+	 * multi {
+	 *	ports {
+	 * =>	lnk:	port@0 { ... };
+	 *		port@1 { ep { ... = rep0 } };
+	 *		port@2 { ep { ... = rep1 } };
+	 *		...
+	 *	};
+	 * };
+	 *
+	 * xxx {
+	 *	port@0 { rep0 };
+	 *	port@1 { rep1 };
+	 * };
+	 */
+	do {
+		*port = of_get_next_child(ports, *port);
+		if (!*port)
+			break;
+	} while (!of_node_name_eq(*port, "port"));
+
+	if (*port) {
+		ep  = port_to_endpoint(*port);
+		rep = of_graph_get_remote_endpoint(ep);
+	}
+
+	of_node_put(ep);
+	of_node_put(ports);
+
+	return rep;
+}
+
 static const struct snd_soc_ops graph_ops = {
 	.startup	= asoc_simple_startup,
 	.shutdown	= asoc_simple_shutdown,
@@ -258,13 +378,21 @@ static int __graph_parse_node(struct asoc_simple_priv *priv,
 	if (!dai_link->name) {
 		struct snd_soc_dai_link_component *cpus = dlc;
 		struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, idx);
+		char *cpu_multi   = "";
+		char *codec_multi = "";
+
+		if (dai_link->num_cpus > 1)
+			cpu_multi = "_multi";
+		if (dai_link->num_codecs > 1)
+			codec_multi = "_multi";
 
 		switch (gtype) {
 		case GRAPH_NORMAL:
 			/* run is_cpu only. see rich_graph_link_normal() */
 			if (is_cpu)
-				asoc_simple_set_dailink_name(dev, dai_link, "%s-%s",
-							     cpus->dai_name, codecs->dai_name);
+				asoc_simple_set_dailink_name(dev, dai_link, "%s%s-%s%s",
+							       cpus->dai_name,   cpu_multi,
+							     codecs->dai_name, codec_multi);
 			break;
 		default:
 			break;
@@ -287,10 +415,33 @@ static int graph_parse_node(struct asoc_simple_priv *priv,
 			    struct device_node *port,
 			    struct link_info *li, int is_cpu)
 {
-	struct device_node *ep = port_to_endpoint(port);
+	struct device_node *ep;
+	int ret = 0;
 
-	/* Need Multi support later */
-	return __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
+	if (graph_lnk_is_multi(port)) {
+		int idx;
+
+		of_node_get(port);
+
+		for (idx = 0;; idx++) {
+			ep = graph_get_next_multi_ep(&port);
+			if (!ep)
+				break;
+
+			ret = __graph_parse_node(priv, gtype, ep,
+						 li, is_cpu, idx);
+			of_node_put(ep);
+			if (ret < 0)
+				break;
+		}
+	} else {
+		/* Single CPU / Codec */
+		ep = port_to_endpoint(port);
+		ret = __graph_parse_node(priv, gtype, ep, li, is_cpu, 0);
+		of_node_put(ep);
+	}
+
+	return ret;
 }
 
 static void graph_parse_daifmt(struct device_node *node,
@@ -354,8 +505,14 @@ static void graph_link_init(struct asoc_simple_priv *priv,
 	unsigned int daifmt = 0, daiclk = 0;
 	unsigned int bit_frame = 0;
 
-	/* Need Multi support later */
-	ep = port_to_endpoint(port);
+	if (graph_lnk_is_multi(port)) {
+		of_node_get(port);
+		ep = graph_get_next_multi_ep(&port);
+		port = of_get_parent(ep);
+	} else {
+		ep = port_to_endpoint(port);
+	}
+
 	ports = of_get_parent(port);
 
 	/*
@@ -462,8 +619,27 @@ static int graph_link(struct asoc_simple_priv *priv,
 
 static int graph_counter(struct device_node *lnk)
 {
-	/* Need Multi support later */
-	return 1;
+	/*
+	 * Multi CPU / Codec
+	 *
+	 * multi {
+	 *	ports {
+	 * =>		lnk:	port@0 { ... };
+	 *			port@1 { ... };
+	 *			port@2 { ... };
+	 *			...
+	 *	};
+	 * };
+	 *
+	 * ignore first lnk part
+	 */
+	if (graph_lnk_is_multi(lnk))
+		return of_graph_get_endpoint_count(of_get_parent(lnk)) - 1;
+	/*
+	 * Single CPU / Codec
+	 */
+	else
+		return 1;
 }
 
 static int graph_count_normal(struct asoc_simple_priv *priv,
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 07/16] ASoC: rich-graph-card: add DPCM support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (5 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 06/16] ASoC: rich-graph-card: add Multi CPU/Codec support Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support Kuninori Morimoto
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds DPCM support to rich-graph-card.
It uses "dpcm" node (= C), needs to have routing (= A),
need to indicate both FE/BE at links (= B).
dpcm ports@0 is for FE (= D), port@1 is for BE (= D).
remote-endpoint can use both Single/Multi connection.

			DSP
		  ************
	PCM0 <--> * fe0  be0 * <--> DAI0: Codec Headset
	PCM1 <--> * fe1  be1 * <--> DAI1: Codec Speakers
	PCM2 <--> * fe2  be2 * <--> DAI2: MODEM
	PCM3 <--> * fe3  be3 * <--> DAI3: BT
		  *	 be4 * <--> DAI4: DMIC
		  *	 be5 * <--> DAI5: FM
		  ************

	sound {
		compatible = "rich-graph-card";

		// indicate routing
(A)		routing = "xxx Playback", "xxx Playback",
			  "xxx Playback", "xxx Playback",
			  "xxx Playback", "xxx Playback";

		// indicate all Front-End, Back-End in DPCM case
(B)		links = <&fe0, &fe1, ...
			 &be0, &be1, ...

(C)		dpcm {
			// Front-End
(D)			ports@0 {
				fe0: port@0 { fe0_ep: endpoint { remote-endpoint = <&pcm0_ep>; }; };
				fe1: port@1 { fe1_ep: endpoint { remote-endpoint = <&pcm1_ep>; }; };
				...
			};
			// Back-End
(E)			ports@1 {
				be0: port@0 { be0_ep: endpoint { remote-endpoint = <&dai0_ep>; }; };
				be1: port@1 { be1_ep: endpoint { remote-endpoint = <&dai1_ep>; }; };
				...
			};
		};
	};

	CPU {
		ports {
			bitclock-master;
			frame-master;
			port@0 { pcm0_ep: endpoint { remote-endpoint = <&fe0_ep>; }; };
			port@1 { pcm1_ep: endpoint { remote-endpoint = <&fe1_ep>; }; };
			...
		};
	};

	Codec {
		ports {
			port@0 { dai0_ep: endpoint { remote-endpoint = <&be0_ep>; }; };
			port@1 { dai1_ep: endpoint { remote-endpoint = <&be1_ep>; }; };
			...
		};
	};

Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/graph_card.h          |   3 +
 sound/soc/generic/rich-graph-card.c | 254 ++++++++++++++++++++++++++++
 2 files changed, 257 insertions(+)

diff --git a/include/sound/graph_card.h b/include/sound/graph_card.h
index 7a22513146c0..c7b632d3e5ff 100644
--- a/include/sound/graph_card.h
+++ b/include/sound/graph_card.h
@@ -17,6 +17,7 @@ struct graph_custom_hooks {
 	int (*hook_pre)(struct asoc_simple_priv *priv);
 	int (*hook_post)(struct asoc_simple_priv *priv);
 	GRAPH_CUSTOM custom_normal;
+	GRAPH_CUSTOM custom_dpcm;
 };
 
 int audio_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev);
@@ -25,5 +26,7 @@ int rich_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev,
 
 int rich_graph_link_normal(struct asoc_simple_priv *priv,
 			   struct device_node *lnk, struct link_info *li);
+int rich_graph_link_dpcm(struct asoc_simple_priv *priv,
+			 struct device_node *lnk, struct link_info *li);
 
 #endif /* __GRAPH_CARD_H */
diff --git a/sound/soc/generic/rich-graph-card.c b/sound/soc/generic/rich-graph-card.c
index 6ce7001fab2e..e69fb5e73d62 100644
--- a/sound/soc/generic/rich-graph-card.c
+++ b/sound/soc/generic/rich-graph-card.c
@@ -116,15 +116,77 @@ links indicates connection part of CPU side (= A).
 	};
  };
 
+ ************************************
+	DPCM
+ ************************************
+
+		DSP
+	   ************
+ PCM0 <--> * fe0  be0 * <--> DAI0: Codec Headset
+ PCM1 <--> * fe1  be1 * <--> DAI1: Codec Speakers
+ PCM2 <--> * fe2  be2 * <--> DAI2: MODEM
+ PCM3 <--> * fe3  be3 * <--> DAI3: BT
+	   *	  be4 * <--> DAI4: DMIC
+	   *	  be5 * <--> DAI5: FM
+	   ************
+
+ sound {
+	compatible = "rich-graph-card";
+
+	// indicate routing
+	routing = "xxx Playback", "xxx Playback",
+		  "xxx Playback", "xxx Playback",
+		  "xxx Playback", "xxx Playback";
+
+	// indicate all Front-End, Back-End
+	links = <&fe0, &fe1, ...,
+		 &be0, &be1, ...>;
+
+	dpcm {
+		// Front-End
+		ports@0 {
+			fe0: port@0 { fe0_ep: endpoint { remote-endpoint = <&pcm0_ep>; }; };
+			fe1: port@1 { fe1_ep: endpoint { remote-endpoint = <&pcm1_ep>; }; };
+			...
+		};
+		// Back-End
+		ports@1 {
+			be0: port@0 { be0_ep: endpoint { remote-endpoint = <&dai0_ep>; }; };
+			be1: port@1 { be1_ep: endpoint { remote-endpoint = <&dai1_ep>; }; };
+			...
+		};
+	};
+ };
+
+ CPU {
+	ports {
+		bitclock-master;
+		frame-master;
+		port@0 { pcm0_ep: endpoint { remote-endpoint = <&fe0_ep>; }; };
+		port@1 { pcm1_ep: endpoint { remote-endpoint = <&fe1_ep>; }; };
+		...
+	};
+ };
+
+ Codec {
+	ports {
+		port@0 { dai0_ep: endpoint { remote-endpoint = <&be0_ep>; }; };
+		port@1 { dai1_ep: endpoint { remote-endpoint = <&be1_ep>; }; };
+		...
+	};
+ };
+
 */
 
 enum graph_type {
 	GRAPH_NORMAL,
+	GRAPH_DPCM,
 
 	GRAPH_MULTI,	/* don't use ! Use this only in __graph_get_type() */
 };
 
 #define GRAPH_NODENAME_MULTI	"multi"
+#define GRAPH_NODENAME_DPCM	"dpcm"
 
 #define port_to_endpoint(port) of_get_child_by_name(port, "endpoint")
 
@@ -147,6 +209,9 @@ static enum graph_type __graph_get_type(struct device_node *lnk)
 	if (of_node_name_eq(np, GRAPH_NODENAME_MULTI))
 		return GRAPH_MULTI;
 
+	if (of_node_name_eq(np, GRAPH_NODENAME_DPCM))
+		return GRAPH_DPCM;
+
 	return GRAPH_NORMAL;
 }
 
@@ -164,6 +229,17 @@ static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
 		struct device *dev = simple_priv_to_dev(priv);
 		const char *str = "Normal";
 
+		switch (type) {
+		case GRAPH_DPCM:
+			if (asoc_graph_is_ports0(lnk))
+				str = "DPCM Front-End";
+			else
+				str = "DPCM Back-End";
+			break;
+		default:
+			break;
+		}
+
 		dev_dbg(dev, "%pOF (%s)", lnk, str);
 	}
 #endif
@@ -322,6 +398,22 @@ static int asoc_simple_parse_dai(struct device_node *ep,
 	return 0;
 }
 
+static void graph_parse_convert(struct device_node *ep,
+				struct simple_dai_props *props)
+{
+	struct device_node *port = of_get_parent(ep);
+	struct device_node *ports = of_get_parent(port);
+	struct asoc_simple_data *adata = &props->adata;
+
+	if (of_node_name_eq(ports, "ports"))
+		asoc_simple_parse_convert(ports, NULL, adata);
+	asoc_simple_parse_convert(port, NULL, adata);
+	asoc_simple_parse_convert(ep,   NULL, adata);
+
+	of_node_put(port);
+	of_node_put(ports);
+}
+
 static void graph_parse_mclk_fs(struct device_node *ep,
 				struct simple_dai_props *props)
 {
@@ -394,11 +486,37 @@ static int __graph_parse_node(struct asoc_simple_priv *priv,
 							       cpus->dai_name,   cpu_multi,
 							     codecs->dai_name, codec_multi);
 			break;
+		case GRAPH_DPCM:
+			if (is_cpu)
+				asoc_simple_set_dailink_name(dev, dai_link, "fe.%pOFP.%s%s",
+						cpus->of_node, cpus->dai_name, cpu_multi);
+			else
+				asoc_simple_set_dailink_name(dev, dai_link, "be.%pOFP.%s%s",
+						codecs->of_node, codecs->dai_name, codec_multi);
+			break;
 		default:
 			break;
 		}
 	}
 
+	/*
+	 * Check "prefix" from top node
+	 * if DPCM-BE case
+	 */
+	if (!is_cpu && gtype == GRAPH_DPCM) {
+		struct snd_soc_dai_link_component *codecs = asoc_link_to_codec(dai_link, idx);
+		struct snd_soc_codec_conf *cconf = simple_props_to_codec_conf(dai_props, idx);
+		struct device_node *rport  = of_get_parent(ep);
+		struct device_node *rports = of_get_parent(rport);
+
+		if (of_node_name_eq(rports, "ports"))
+			snd_soc_of_parse_node_prefix(rports, cconf, codecs->of_node, "prefix");
+		snd_soc_of_parse_node_prefix(rport,  cconf, codecs->of_node, "prefix");
+
+		of_node_put(rport);
+		of_node_put(rports);
+	}
+
 	if (is_cpu) {
 		struct snd_soc_dai_link_component *cpus = dlc;
 		struct snd_soc_dai_link_component *platforms = asoc_link_to_platform(dai_link, idx);
@@ -582,6 +700,98 @@ int rich_graph_link_normal(struct asoc_simple_priv *priv,
 }
 EXPORT_SYMBOL_GPL(rich_graph_link_normal);
 
+int rich_graph_link_dpcm(struct asoc_simple_priv *priv,
+			 struct device_node *lnk,
+			 struct link_info *li)
+{
+	struct device_node *ep = port_to_endpoint(lnk);
+	struct device_node *rep = of_graph_get_remote_endpoint(ep);
+	struct device_node *rport = of_graph_get_remote_port(ep);
+	struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
+	struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
+	int is_cpu = asoc_graph_is_ports0(lnk);
+	int ret;
+
+	if (is_cpu) {
+		/*
+		 * dpcm {
+		 *	// Front-End
+		 *	ports@0 {
+		 * =>		lnk: port@0 { ep: { ... = rep }; };
+		 *		 ...
+		 *	};
+		 *	// Back-End
+		 *	ports@0 {
+		 *		 ...
+		 *	};
+		 * };
+		 *
+		 * CPU {
+		 *	rports: ports {
+		 *		rport: port@0 { rep: { ... = ep } };
+		 *	}
+		 * }
+		 */
+		/*
+		 * setup CPU here, Codec is already set as dummy.
+		 * see
+		 *	asoc_simple_init_priv()
+		 */
+		dai_link->dynamic		= 1;
+		dai_link->dpcm_merged_format	= 1;
+
+		ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 1);
+		if (ret)
+			goto err;
+	} else {
+		/*
+		 * dpcm {
+		 *	// Front-End
+		 *	ports@0 {
+		 *		 ...
+		 *	};
+		 *	// Back-End
+		 *	ports@0 {
+		 * =>		lnk: port@0 { ep: { ... = rep; }; };
+		 *		 ...
+		 *	};
+		 * };
+		 *
+		 * Codec {
+		 *	rports: ports {
+		 *		rport: port@0 { rep: { ... = ep; }; };
+		 *	}
+		 * }
+		 */
+		/*
+		 * setup Codec here, CPU is already set as dummy.
+		 * see
+		 *	asoc_simple_init_priv()
+		 */
+
+		/* BE settings */
+		dai_link->no_pcm		= 1;
+		dai_link->be_hw_params_fixup	= asoc_simple_be_hw_params_fixup;
+
+		ret = graph_parse_node(priv, GRAPH_DPCM, rport, li, 0);
+		if (ret < 0)
+			goto err;
+	}
+
+	graph_parse_convert(rep, dai_props);
+
+	snd_soc_dai_link_set_capabilities(dai_link);
+
+	graph_link_init(priv, rport, li, is_cpu);
+err:
+	of_node_put(ep);
+	of_node_put(rep);
+	of_node_put(rport);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(rich_graph_link_dpcm);
+
 static int graph_link(struct asoc_simple_priv *priv,
 		      struct graph_custom_hooks *hooks,
 		      enum graph_type gtype,
@@ -599,6 +809,12 @@ static int graph_link(struct asoc_simple_priv *priv,
 		else
 			func = rich_graph_link_normal;
 		break;
+	case GRAPH_DPCM:
+		if (hooks && hooks->custom_dpcm)
+			func = hooks->custom_dpcm;
+		else
+			func = rich_graph_link_dpcm;
+		break;
 	default:
 		break;
 	}
@@ -665,6 +881,41 @@ static int graph_count_normal(struct asoc_simple_priv *priv,
 	return 0;
 }
 
+static int graph_count_dpcm(struct asoc_simple_priv *priv,
+			    struct device_node *lnk,
+			    struct link_info *li)
+{
+	struct device_node *ep = port_to_endpoint(lnk);
+	struct device_node *rport = of_graph_get_remote_port(ep);
+
+	/*
+	 * dpcm {
+	 *	// Front-End
+	 *	ports@0 {
+	 * =>		lnk: port@0 { endpoint { ... }; };
+	 *		 ...
+	 *	};
+	 *	// Back-End
+	 *	ports@1 {
+	 * =>		lnk: port@0 { endpoint { ... }; };
+	 *		 ...
+	 *	};
+	 * };
+	 */
+
+	if (asoc_graph_is_ports0(lnk)) {
+		li->num[li->link].cpus		= graph_counter(rport); /* FE */
+		li->num[li->link].platforms	= graph_counter(rport);
+	} else {
+		li->num[li->link].codecs	= graph_counter(rport); /* BE */
+	}
+
+	of_node_put(ep);
+	of_node_put(rport);
+
+	return 0;
+}
+
 static int graph_count(struct asoc_simple_priv *priv,
 		       struct graph_custom_hooks *hooks,
 		       enum graph_type gtype,
@@ -684,6 +935,9 @@ static int graph_count(struct asoc_simple_priv *priv,
 	case GRAPH_NORMAL:
 		func = graph_count_normal;
 		break;
+	case GRAPH_DPCM:
+		func = graph_count_dpcm;
+		break;
 	default:
 	}
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (6 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 07/16] ASoC: rich-graph-card: add DPCM support Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-12  6:43     ` kernel test robot
  2021-09-10  1:22 ` [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document Kuninori Morimoto
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Codec2Codec support to rich-graph-card.
It can use Codec2Codec but very simple case only for now.
It doesn't have "SWITCH" control yet, thus it start automatically
when it was probed, and can't stop, so far.
Thus it needs to be updated around widgets/routing handling,
and you need to understand that it is under experimental.

Codec has SND_SOC_DAPM_INPUT() (= IN) / SND_SOC_DAPM_OUTPUT(= OUT)
widgets in below case.

It is assuming 2channel, S32_LE format for now.
It needs to be updated, too.

It needs "codec2codec" node (= C), needs to have routing (= A),
need to indicate both CPU side at links (= B).
ports@0 is for CPU side (= X), port@1 is Codec side (= Y).
It needs to have "rate" (= D)

	+--+
	|  |<-- Codec0 <-- IN
	|  |--> Codec1 --> OUT
	+--+

	sound {
		compatible = "rich-graph-card";

(A)		routing = "OUT" ,"DAI1 Playback",
			  "DAI0 Capture", "IN";

(B)		links = <&c2c>;

(C)		codec2codec {
			ports {
(D)				rate = <48000>;
(X)			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
(Y)				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
		};
	};

	Codec {
		ports {
			port@0 {
				 bitclock-master;
				 frame-master;
				 codec0_ep: endpoint { remote-endpoint = <&c2cf_ep>; }; };
			port@1 { codec1_ep: endpoint { remote-endpoint = <&c2cb_ep>; }; };
		};
	};

Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/graph_card.h          |   3 +
 sound/soc/generic/rich-graph-card.c | 178 ++++++++++++++++++++++++++++
 2 files changed, 181 insertions(+)

diff --git a/include/sound/graph_card.h b/include/sound/graph_card.h
index c7b632d3e5ff..8bc8a78c0d03 100644
--- a/include/sound/graph_card.h
+++ b/include/sound/graph_card.h
@@ -18,6 +18,7 @@ struct graph_custom_hooks {
 	int (*hook_post)(struct asoc_simple_priv *priv);
 	GRAPH_CUSTOM custom_normal;
 	GRAPH_CUSTOM custom_dpcm;
+	GRAPH_CUSTOM custom_c2c;
 };
 
 int audio_graph_parse_of(struct asoc_simple_priv *priv, struct device *dev);
@@ -28,5 +29,7 @@ int rich_graph_link_normal(struct asoc_simple_priv *priv,
 			   struct device_node *lnk, struct link_info *li);
 int rich_graph_link_dpcm(struct asoc_simple_priv *priv,
 			 struct device_node *lnk, struct link_info *li);
+int rich_graph_link_c2c(struct asoc_simple_priv *priv,
+			struct device_node *lnk, struct link_info *li);
 
 #endif /* __GRAPH_CARD_H */
diff --git a/sound/soc/generic/rich-graph-card.c b/sound/soc/generic/rich-graph-card.c
index e69fb5e73d62..5a972eda037f 100644
--- a/sound/soc/generic/rich-graph-card.c
+++ b/sound/soc/generic/rich-graph-card.c
@@ -176,17 +176,54 @@ links indicates connection part of CPU side (= A).
 	};
  };
 
+ ************************************
+	Codec to Codec
+ ************************************
+
+ +--+
+ |  |<-- Codec0 <- IN
+ |  |--> Codec1 -> OUT
+ +--+
+
+ sound {
+	compatible = "rich-graph-card";
+
+	routing = "OUT" ,"DAI1 Playback",
+		  "DAI0 Capture", "IN";
+
+	links = <&c2c>;
+
+	codec2codec {
+		ports {
+			rate = <48000>;
+		c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
+			port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
+	};
+ };
+
+ Codec {
+	ports {
+		port@0 {
+			bitclock-master;
+			frame-master;
+			 codec0_ep: endpoint { remote-endpoint = <&c2cf_ep>; }; };
+		port@1 { codec1_ep: endpoint { remote-endpoint = <&c2cb_ep>; }; };
+	};
+ };
+
 */
 
 enum graph_type {
 	GRAPH_NORMAL,
 	GRAPH_DPCM,
+	GRAPH_C2C,
 
 	GRAPH_MULTI,	/* don't use ! Use this only in __graph_get_type() */
 };
 
 #define GRAPH_NODENAME_MULTI	"multi"
 #define GRAPH_NODENAME_DPCM	"dpcm"
+#define GRAPH_NODENAME_C2C	"codec2codec"
 
 #define port_to_endpoint(port) of_get_child_by_name(port, "endpoint")
 
@@ -212,6 +249,9 @@ static enum graph_type __graph_get_type(struct device_node *lnk)
 	if (of_node_name_eq(np, GRAPH_NODENAME_DPCM))
 		return GRAPH_DPCM;
 
+	if (of_node_name_eq(np, GRAPH_NODENAME_C2C))
+		return GRAPH_C2C;
+
 	return GRAPH_NORMAL;
 }
 
@@ -236,6 +276,9 @@ static enum graph_type graph_get_type(struct asoc_simple_priv *priv,
 			else
 				str = "DPCM Back-End";
 			break;
+		case GRAPH_C2C:
+			str = "Codec2Codec";
+			break;
 		default:
 			break;
 		}
@@ -494,6 +537,13 @@ static int __graph_parse_node(struct asoc_simple_priv *priv,
 				asoc_simple_set_dailink_name(dev, dai_link, "be.%pOFP.%s%s",
 						codecs->of_node, codecs->dai_name, codec_multi);
 			break;
+		case GRAPH_C2C:
+			/* run is_cpu only. see rich_graph_link_c2c() */
+			if (is_cpu)
+				asoc_simple_set_dailink_name(dev, dai_link, "c2c.%s%s-%s%s",
+							     cpus->dai_name,   cpu_multi,
+							     codecs->dai_name, codec_multi);
+			break;
 		default:
 			break;
 		}
@@ -792,6 +842,88 @@ int rich_graph_link_dpcm(struct asoc_simple_priv *priv,
 }
 EXPORT_SYMBOL_GPL(rich_graph_link_dpcm);
 
+int rich_graph_link_c2c(struct asoc_simple_priv *priv,
+			struct device_node *lnk,
+			struct link_info *li)
+{
+	struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
+	struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
+	struct snd_soc_pcm_stream *c2c_conf = dai_props->c2c_conf;
+	struct device_node *port0, *port1, *ports;
+	struct device_node *codec0_port, *codec1_port;
+	struct device_node *ep0, *ep1;
+	u32 val;
+	int ret = -EINVAL;
+
+	/*
+	 * codec2codec {
+	 *	ports {
+	 *		rate = <48000>;
+	 * =>	lnk:	port@0 { c2c0_ep: { ... = codec0_ep; }; };
+	 *		port@1 { c2c1_ep: { ... = codec1_ep; }; };
+	 *	};
+	 * };
+	 *
+	 * Codec {
+	 *	ports {
+	 *		port@0 { codec0_ep: ... }; };
+	 *		port@1 { codec1_ep: ... }; };
+	 *	};
+	 * };
+	 */
+	of_node_get(lnk);
+	port0 = lnk;
+	ports = of_get_parent(port0);
+	port1 = of_get_next_child(ports, lnk);
+
+	if (!of_get_property(ports, "rate", &val)) {
+		struct device *dev = simple_priv_to_dev(priv);
+
+		dev_err(dev, "Codec2Codec needs rate settings\n");
+		goto err;
+	}
+
+	c2c_conf->formats	= SNDRV_PCM_FMTBIT_S32_LE; /* update ME */
+	c2c_conf->rate_min	=
+	c2c_conf->rate_max	= val;
+	c2c_conf->channels_min	=
+	c2c_conf->channels_max	= 2; /* update ME */
+	dai_link->params	= c2c_conf;
+
+	ep0 = port_to_endpoint(port0);
+	ep1 = port_to_endpoint(port1);
+
+	codec0_port = of_graph_get_remote_port(ep0);
+	codec1_port = of_graph_get_remote_port(ep1);
+
+	/*
+	 * call Codec first.
+	 * see
+	 *	__graph_parse_node() :: DAI Naming
+	 */
+	ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0);
+	if (ret < 0)
+		goto err;
+
+	/*
+	 * call CPU, and set DAI Name
+	 */
+	ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1);
+	if (ret < 0)
+		goto err;
+
+	graph_link_init(priv, codec0_port, li, 1);
+err:
+	of_node_put(ports);
+	of_node_put(port0);
+	of_node_put(port1);
+	of_node_put(ep0);
+	of_node_put(ep1);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(rich_graph_link_c2c);
+
 static int graph_link(struct asoc_simple_priv *priv,
 		      struct graph_custom_hooks *hooks,
 		      enum graph_type gtype,
@@ -815,6 +947,12 @@ static int graph_link(struct asoc_simple_priv *priv,
 		else
 			func = rich_graph_link_dpcm;
 		break;
+	case GRAPH_C2C:
+		if (hooks && hooks->custom_c2c)
+			func = hooks->custom_c2c;
+		else
+			func = rich_graph_link_c2c;
+		break;
 	default:
 		break;
 	}
@@ -916,6 +1054,43 @@ static int graph_count_dpcm(struct asoc_simple_priv *priv,
 	return 0;
 }
 
+static int graph_count_c2c(struct asoc_simple_priv *priv,
+			   struct device_node *lnk,
+			   struct link_info *li)
+{
+	struct device_node *ports = of_get_parent(lnk);
+	struct device_node *port0 = lnk;
+	struct device_node *port1 = of_get_next_child(ports, lnk);
+	struct device_node *ep0 = port_to_endpoint(port0);
+	struct device_node *ep1 = port_to_endpoint(port1);
+	struct device_node *codec0 = of_graph_get_remote_port(ep0);
+	struct device_node *codec1 = of_graph_get_remote_port(ep1);
+
+	of_node_get(lnk);
+
+	/*
+	 * codec2codec {
+	 *	ports {
+	 * =>	lnk:	port@0 { endpoint { ... }; };
+	 *		port@1 { endpoint { ... }; };
+	 *	};
+	 * };
+	 */
+	li->num[li->link].cpus		=
+	li->num[li->link].platforms	= graph_counter(codec0);
+	li->num[li->link].codecs	= graph_counter(codec1);
+	li->num[li->link].c2c		= 1;
+
+	of_node_put(ports);
+	of_node_put(port1);
+	of_node_put(ep0);
+	of_node_put(ep1);
+	of_node_put(codec0);
+	of_node_put(codec1);
+
+	return 0;
+}
+
 static int graph_count(struct asoc_simple_priv *priv,
 		       struct graph_custom_hooks *hooks,
 		       enum graph_type gtype,
@@ -938,6 +1113,9 @@ static int graph_count(struct asoc_simple_priv *priv,
 	case GRAPH_DPCM:
 		func = graph_count_dpcm;
 		break;
+	case GRAPH_C2C:
+		func = graph_count_c2c;
+		break;
 	default:
 	}
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (7 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-10-01 21:06   ` Mark Brown
  2021-09-10  1:22 ` [PATCH v3 10/16] ASoC: add Rich Graph Card Custom Sample Kuninori Morimoto
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Rich Graph Card Yaml Document to Linux.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 .../bindings/sound/rich-graph-card.yaml       | 57 +++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/rich-graph-card.yaml

diff --git a/Documentation/devicetree/bindings/sound/rich-graph-card.yaml b/Documentation/devicetree/bindings/sound/rich-graph-card.yaml
new file mode 100644
index 000000000000..f998c50da8f7
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rich-graph-card.yaml
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/rich-graph-card.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Rich Graph Card Device Tree Bindings
+
+maintainers:
+  - Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+
+properties:
+  compatible:
+    enum:
+      - rich-graph-card
+  links:
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+  label:
+    maxItems: 1
+  routing:
+    description: |
+      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.
+    $ref: /schemas/types.yaml#/definitions/non-unique-string-array
+  multi:
+    description: Multi-CPU/Codec node
+  dpcm:
+    description: DPCM node
+  codec2codec:
+    description: Codec to Codec node
+
+required:
+  - compatible
+  - links
+
+additionalProperties: false
+
+examples:
+  - |
+    sound {
+        compatible = "rich-graph-card";
+
+        links = <&cpu_port>;
+    };
+
+    cpu {
+        compatible = "cpu-driver";
+
+        cpu_port: port { cpu_ep: endpoint { remote-endpoint = <&codec_ep>; }; };
+    };
+
+    codec {
+        compatible = "codec-driver";
+
+        port { codec_ep: endpoint { remote-endpoint = <&cpu_ep>; }; };
+    };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 10/16] ASoC: add Rich Graph Card Custom Sample
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (8 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 11/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single) Kuninori Morimoto
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

rich-graph-card has customizing support.
This means user can re-use rich-graph-card DT parsing, and possible
to expand to own special handling.

This patch adds Rich Graph Card's Customize Sample Driver.
It can re-use rich-graph-card parsing by calling
rich_graph_parse_of(...), and user can expand each functions by
using hooks.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/Kconfig                   |   6 +
 sound/soc/generic/Makefile                  |   2 +
 sound/soc/generic/rich-custom-card-sample.c | 174 ++++++++++++++++++++
 3 files changed, 182 insertions(+)
 create mode 100644 sound/soc/generic/rich-custom-card-sample.c

diff --git a/sound/soc/generic/Kconfig b/sound/soc/generic/Kconfig
index 8af35415d162..4caf6c007752 100644
--- a/sound/soc/generic/Kconfig
+++ b/sound/soc/generic/Kconfig
@@ -26,6 +26,12 @@ config SND_RICH_GRAPH_CARD
 	  This option enables generic rich graph card support
 	  with OF-graph DT bindings.
 
+config SND_RICH_CUSTOM_CARD_SAMPLE
+	tristate "ASoC Audio Rich Graph Card base custom card sample support"
+	depends on SND_RICH_GRAPH_CARD
+	help
+	  This option enables Audio Rich Graph Card base custom card support
+
 config SND_TEST_COMPONENT
 	tristate "ASoC Test component sound support"
 	depends on OF
diff --git a/sound/soc/generic/Makefile b/sound/soc/generic/Makefile
index 60a2e90a4a6b..030ab7e83483 100644
--- a/sound/soc/generic/Makefile
+++ b/sound/soc/generic/Makefile
@@ -4,9 +4,11 @@ snd-soc-simple-card-objs	:= simple-card.o
 snd-soc-audio-graph-card-objs	:= audio-graph-card.o
 snd-soc-rich-graph-card-objs	:= rich-graph-card.o
 snd-soc-test-component-objs	:= test-component.o
+snd-soc-rich-custom-card-sample-objs := rich-custom-card-sample.o
 
 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)	+= snd-soc-simple-card-utils.o
 obj-$(CONFIG_SND_SIMPLE_CARD)		+= snd-soc-simple-card.o
 obj-$(CONFIG_SND_AUDIO_GRAPH_CARD)	+= snd-soc-audio-graph-card.o
 obj-$(CONFIG_SND_RICH_GRAPH_CARD)	+= snd-soc-rich-graph-card.o
 obj-$(CONFIG_SND_TEST_COMPONENT)	+= snd-soc-test-component.o
+obj-$(CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE) += snd-soc-rich-custom-card-sample.o
diff --git a/sound/soc/generic/rich-custom-card-sample.c b/sound/soc/generic/rich-custom-card-sample.c
new file mode 100644
index 000000000000..6b9bc0393f60
--- /dev/null
+++ b/sound/soc/generic/rich-custom-card-sample.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// rich-custom-card-sample.c
+//
+// Copyright (C) 2020 Renesas Electronics Corp.
+// Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+//
+#include <linux/module.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <sound/graph_card.h>
+
+/*
+ * Custom driver can have own priv
+ * which includes asoc_simple_priv.
+ */
+struct custom_priv {
+	struct asoc_simple_priv simple_priv;
+
+	/* custom driver's own params */
+	int custom_params;
+};
+
+/* You can get custom_priv from simple_priv */
+#define simple_to_custom(simple) container_of((simple), struct custom_priv, simple_priv)
+
+static int custom_card_probe(struct snd_soc_card *card)
+{
+	struct asoc_simple_priv *simple_priv = snd_soc_card_get_drvdata(card);
+	struct custom_priv *custom_priv = simple_to_custom(simple_priv);
+	struct device *dev = simple_priv_to_dev(simple_priv);
+
+	dev_info(dev, "custom probe\n");
+
+	custom_priv->custom_params = 1;
+
+	/* you can use generic probe function */
+	return asoc_graph_card_probe(card);
+}
+
+static int custom_hook_pre(struct asoc_simple_priv *priv)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+
+	/* You can custom before parsing */
+	dev_info(dev, "hook : %s\n", __func__);
+
+	return 0;
+}
+
+static int custom_hook_post(struct asoc_simple_priv *priv)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+	struct snd_soc_card *card;
+
+	/* You can custom after parsing */
+	dev_info(dev, "hook : %s\n", __func__);
+
+	card = simple_priv_to_card(priv);
+	card->probe = custom_card_probe; /* overwrite .probe */
+
+	return 0;
+}
+
+static int custom_normal(struct asoc_simple_priv *priv,
+			 struct device_node *lnk,
+			 struct link_info *li)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+
+	/* You can custom for DPCM parsing */
+	dev_info(dev, "hook : %s\n", __func__);
+
+	return rich_graph_link_dpcm(priv, lnk, li);
+}
+
+
+static int custom_dpcm(struct asoc_simple_priv *priv,
+		       struct device_node *lnk,
+		       struct link_info *li)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+
+	/* You can custom for DPCM parsing */
+	dev_info(dev, "hook : %s\n", __func__);
+
+	return rich_graph_link_dpcm(priv, lnk, li);
+}
+
+static int custom_c2c(struct asoc_simple_priv *priv,
+		      struct device_node *lnk,
+		      struct link_info *li)
+{
+	struct device *dev = simple_priv_to_dev(priv);
+
+	/* You can custom for Codec2Codec parsing */
+	dev_info(dev, "hook : %s\n", __func__);
+
+	return rich_graph_link_c2c(priv, lnk, li);
+}
+
+/*
+ * rich-graph-card has many hooks for your customizing.
+ */
+static struct graph_custom_hooks custom_hooks = {
+	.hook_pre	= custom_hook_pre,
+	.hook_post	= custom_hook_post,
+	.custom_normal	= custom_normal,
+	.custom_dpcm	= custom_dpcm,
+	.custom_c2c	= custom_c2c,
+};
+
+static int custom_startup(struct snd_pcm_substream *substream)
+{
+	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+	struct asoc_simple_priv *priv = snd_soc_card_get_drvdata(rtd->card);
+	struct device *dev = simple_priv_to_dev(priv);
+
+	dev_info(dev, "custom startup\n");
+
+	return asoc_simple_startup(substream);
+}
+
+/* You can use custom ops */
+static const struct snd_soc_ops custom_ops = {
+	.startup	= custom_startup,
+	.shutdown	= asoc_simple_shutdown,
+	.hw_params	= asoc_simple_hw_params,
+};
+
+static int custom_probe(struct platform_device *pdev)
+{
+	struct custom_priv *custom_priv;
+	struct asoc_simple_priv *simple_priv;
+	struct device *dev = &pdev->dev;
+	int ret;
+
+	custom_priv = devm_kzalloc(dev, sizeof(*custom_priv), GFP_KERNEL);
+	if (!custom_priv)
+		return -ENOMEM;
+
+	simple_priv		= &custom_priv->simple_priv;
+	simple_priv->ops	= &custom_ops; /* customize dai_link ops */
+
+	/* use rich-graph-card parsing with own custom hooks */
+	ret = rich_graph_parse_of(simple_priv, dev, &custom_hooks);
+	if (ret < 0)
+		return ret;
+
+	/* customize more if needed */
+
+	return 0;
+}
+
+static const struct of_device_id custom_of_match[] = {
+	{ .compatible = "rich-custom-card-sample", },
+	{},
+};
+MODULE_DEVICE_TABLE(of, custom_of_match);
+
+static struct platform_driver custom_card = {
+	.driver = {
+		.name = "rich-custom-card-sample",
+		.of_match_table = custom_of_match,
+	},
+	.probe	= custom_probe,
+	.remove	= asoc_simple_remove,
+};
+module_platform_driver(custom_card);
+
+MODULE_ALIAS("platform:asoc-rich-custom-card-sample");
+MODULE_LICENSE("GPL v2");
+MODULE_DESCRIPTION("ASoC Rich Custom Card Sample");
+MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 11/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (9 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 10/16] ASoC: add Rich Graph Card Custom Sample Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 12/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti) Kuninori Morimoto
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Rich Graph Card settings is a little bit difficult for beginner,
and Customizing it also difficult/confusable too.
So, this patch adds sample for it.

You can easily use it by adding below line on your DT file,
and select CONFIGs to your .config.

	#include "../../../../../sound/soc/generic/rich-graph-card-sample.dtsi"

	CONFIG_SND_RICH_GRAPH_CARD
	CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE
	CONFIG_SND_TEST_COMPONENT

This patch uses rich-graph-card base sample custom driver.
You can directly use rich-graph-card instead of custom driver
by modifing compatible.

	- compatible = "rich-custom-card-sample";
	+ compatible = "rich-graph-card";

Sample custom driver will indicate customized print.

It is using Test-Component driver for CPU/Codec.
It can indicate more detail print of each behavior if user want to.
In such case, you need to update compatible to "xxx-nv" or "xxx-vv".

	- compatible = "test-cpu";
	+ compatible = "test-cpu-nv";

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 69 +++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100644 sound/soc/generic/rich-graph-card-sample.dtsi

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
new file mode 100644
index 000000000000..0b4fc71f581d
--- /dev/null
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * rich-graph-card-sample.dtsi
+ *
+ * Copyright (C) 2020 Renesas Electronics Corp.
+ * Copyright (C) 2020 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * This sample indicates how to use rich-graph-card and its
+ * custom driver. "rich-custom-card-sample" is the custome driver
+ * which is using rich-graph-card.
+ *
+ * You can easily use this sample by adding below line on your DT file,
+ * and add new CONFIG to your .config.
+ *
+ *	#include "../../../../../sound/soc/generic/rich-graph-card-sample.dtsi"
+ *
+ *	CONFIG_SND_RICH_GRAPH_CARD
+ *	CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE
+ *	CONFIG_SND_TEST_COMPONENT
+ */
+/ {
+	/*
+	 * @ : used at links
+	 *
+	 * [Normal]
+	 *	cpu0 <-@-----------------> codec0
+	 */
+	rich-graph-card-sample {
+		/*
+		 * You can use rich-graph-card directly by using
+		 *
+		 * compatible = "rich-graph-card";
+		 */
+		compatible = "rich-custom-card-sample";
+
+		links = <&cpu0			/* normal: cpu side only */
+		>;
+	};
+
+	test_cpu {
+		/*
+		 * update compatible to indicate more detail behaviour
+		 * if you want. see test-compatible for more detail.
+		 *
+		 *	- compatible = "test-cpu";
+		 *	+ compatible = "test-cpu-nv";
+		 */
+		compatible = "test-cpu";
+		ports {
+			bitclock-master;
+			frame-master;
+			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
+		};
+	};
+
+	test_codec {
+		/*
+		 * update compatible to indicate more detail behaviour
+		 * if you want. see test-compatible for more detail.
+		 *
+		 *	- compatible = "test-codec";
+		 *	+ compatible = "test-codec-nv";
+		 */
+		compatible = "test-codec";
+		ports {
+			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
+		};
+	};
+};
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 12/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (10 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 11/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single) Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:22 ` [PATCH v3 13/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single) Kuninori Morimoto
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Normal link Multi-CPU/Codec sample to
rich-graph-card-sample.dtsi.

               +-+       +-+
        CPU1 --| | <---> | | -- Codec1
        CPU2 --| |       | | -- Codec2
               +-+       +-+

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
index 0b4fc71f581d..7339d1999f99 100644
--- a/sound/soc/generic/rich-graph-card-sample.dtsi
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -24,6 +24,12 @@ / {
 	 *
 	 * [Normal]
 	 *	cpu0 <-@-----------------> codec0
+	 *
+	 * [Multi-CPU/Codec]
+	 *		+-+		+-+
+	 *	cpu1 <--| |<-@--------->| |-> codec1
+	 *	cpu2 <--| |		| |-> codec2
+	 *		+-+		+-+
 	 */
 	rich-graph-card-sample {
 		/*
@@ -34,7 +40,21 @@ rich-graph-card-sample {
 		compatible = "rich-custom-card-sample";
 
 		links = <&cpu0			/* normal: cpu side only */
+			 &mcpu0			/* multi:  cpu side only */
 		>;
+
+		multi {
+			ports@0 {
+			mcpu0:	port@0 { mcpu0_ep: endpoint { remote-endpoint = <&mcodec0_ep>; }; };
+				port@1 { mcpu1_ep: endpoint { remote-endpoint = <&cpu1_ep>;    }; };
+				port@2 { mcpu2_ep: endpoint { remote-endpoint = <&cpu2_ep>;    }; };
+			};
+			ports@1 {
+				port@0 { mcodec0_ep: endpoint { remote-endpoint = <&mcpu0_ep>;  }; };
+				port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
+				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
+			};
+		};
 	};
 
 	test_cpu {
@@ -50,6 +70,8 @@ ports {
 			bitclock-master;
 			frame-master;
 			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
+			      port@1 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
+			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
 		};
 	};
 
@@ -64,6 +86,8 @@ test_codec {
 		compatible = "test-codec";
 		ports {
 			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
+			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
+			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
 		};
 	};
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 13/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (11 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 12/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti) Kuninori Morimoto
@ 2021-09-10  1:22 ` Kuninori Morimoto
  2021-09-10  1:23 ` [PATCH v3 14/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi) Kuninori Morimoto
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:22 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds DPCM link Single-CPU/Codec sample to
rich-graph-card-sample.dtsi.
This sample is assuming MIXer connection.

	FE		BE
		****
	CPU3 -- *  * -- Codec3
	CPU4 -- *  *
		****

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 36 +++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
index 7339d1999f99..2402827bbdaf 100644
--- a/sound/soc/generic/rich-graph-card-sample.dtsi
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -30,6 +30,13 @@ / {
 	 *	cpu1 <--| |<-@--------->| |-> codec1
 	 *	cpu2 <--| |		| |-> codec2
 	 *		+-+		+-+
+	 *
+	 * [DPCM]
+	 *	FE		BE
+	 *		  ****
+	 *	cpu3 <-@--*  *--@-> codec3
+	 *	cpu4 <-@--*  *
+	 *		  ****
 	 */
 	rich-graph-card-sample {
 		/*
@@ -39,8 +46,16 @@ rich-graph-card-sample {
 		 */
 		compatible = "rich-custom-card-sample";
 
+			/* for [DPCM]		   */
+			/* BE			FE */
+		routing = "TC DAI3 Playback",	"DAI3 Playback",
+			  "TC DAI3 Playback",	"DAI4 Playback",
+			  "DAI3 Capture",	"TC DAI3 Capture",
+			  "DAI4 Capture",	"TC DAI3 Capture";
+
 		links = <&cpu0			/* normal: cpu side only */
 			 &mcpu0			/* multi:  cpu side only */
+			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
 		>;
 
 		multi {
@@ -55,6 +70,18 @@ ports@1 {
 				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
 			};
 		};
+
+		dpcm {
+			/* FE */
+			ports@0 {
+			fe00:	port@0 { fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
+			fe01:	port@1 { fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
+			};
+			/* BE */
+			ports@1 {
+			be0:	port@0 { be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
+			};
+		};
 	};
 
 	test_cpu {
@@ -72,6 +99,8 @@ ports {
 			cpu0: port@0 { cpu0_ep: endpoint { remote-endpoint = <&codec0_ep>; }; };
 			      port@1 { cpu1_ep: endpoint { remote-endpoint = <&mcpu1_ep>; }; };
 			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
+			      port@3 { cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
+			      port@4 { cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
 		};
 	};
 
@@ -85,9 +114,16 @@ test_codec {
 		 */
 		compatible = "test-codec";
 		ports {
+			/*
+			 * prefix can be added to *component*,
+			 * see rich-graph-card::routing
+			 */
+			prefix = "TC";
+
 			port@0  { codec0_ep:  endpoint { remote-endpoint = <&cpu0_ep>; }; };
 			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
 			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
+			port@3  { codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; }; };
 		};
 	};
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 14/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (12 preceding siblings ...)
  2021-09-10  1:22 ` [PATCH v3 13/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single) Kuninori Morimoto
@ 2021-09-10  1:23 ` Kuninori Morimoto
  2021-09-10  1:23 ` [PATCH v3 15/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single) Kuninori Morimoto
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:23 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds DPCM link Multi-CPU/Codec sample to
rich-graph-card-sample.dtsi.
This sample is assuming MIXer connection.
One note is that Multi-FE is not supported on ASoC

	FE		BE
		****	+-+
	CPU5 -- *  * -- | | -- Codec4
	CPU6 -- *  *	| | -- Codec5
		****	+-+

This reverts commit 674bf04819aaf63b98c83e803ff920e35e315d08.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 36 ++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
index 2402827bbdaf..25b9c52cb072 100644
--- a/sound/soc/generic/rich-graph-card-sample.dtsi
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -37,6 +37,17 @@ / {
 	 *	cpu3 <-@--*  *--@-> codec3
 	 *	cpu4 <-@--*  *
 	 *		  ****
+	 *
+	 * [DPCM-Multi]
+	 *
+	 * --NOTE--
+	 * Multi-FE is not supported by ASoC.
+	 *
+	 *	FE		BE
+	 *		  ****	    +-+
+	 *	cpu5 <-@--*  *--@-> | | -> codec4
+	 *	cpu6 <-@--*  *	    | | -> codec5
+	 *		  ****	    +-+
 	 */
 	rich-graph-card-sample {
 		/*
@@ -51,11 +62,22 @@ rich-graph-card-sample {
 		routing = "TC DAI3 Playback",	"DAI3 Playback",
 			  "TC DAI3 Playback",	"DAI4 Playback",
 			  "DAI3 Capture",	"TC DAI3 Capture",
-			  "DAI4 Capture",	"TC DAI3 Capture";
+			  "DAI4 Capture",	"TC DAI3 Capture",
+			/* for [DPCM-Multi]	   */
+			/* BE			FE */
+			  "TC DAI4 Playback",	"DAI5 Playback",
+			  "TC DAI5 Playback",	"DAI5 Playback",
+			  "TC DAI4 Playback",	"DAI6 Playback",
+			  "TC DAI5 Playback",	"DAI6 Playback",
+			  "DAI5 Capture",	"TC DAI4 Capture",
+			  "DAI5 Capture",	"TC DAI5 Capture",
+			  "DAI6 Capture",	"TC DAI4 Capture",
+			  "DAI6 Capture",	"TC DAI5 Capture";
 
 		links = <&cpu0			/* normal: cpu side only */
 			 &mcpu0			/* multi:  cpu side only */
 			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
+			 &fe10 &fe11 &be1	/* dpcm-m: both FE / BE  */
 		>;
 
 		multi {
@@ -69,6 +91,11 @@ ports@1 {
 				port@1 { mcodec1_ep: endpoint { remote-endpoint = <&codec1_ep>; }; };
 				port@2 { mcodec2_ep: endpoint { remote-endpoint = <&codec2_ep>; }; };
 			};
+			ports@2 {
+				port@0 { mbe_ep:  endpoint { remote-endpoint = <&be10_ep>;  }; };
+				port@1 { mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
+				port@2 { mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
+			};
 		};
 
 		dpcm {
@@ -76,10 +103,13 @@ dpcm {
 			ports@0 {
 			fe00:	port@0 { fe00_ep: endpoint { remote-endpoint = <&cpu3_ep>; }; };
 			fe01:	port@1 { fe01_ep: endpoint { remote-endpoint = <&cpu4_ep>; }; };
+			fe10:	port@2 { fe10_ep: endpoint { remote-endpoint = <&cpu5_ep>; }; };
+			fe11:	port@3 { fe11_ep: endpoint { remote-endpoint = <&cpu6_ep>; }; };
 			};
 			/* BE */
 			ports@1 {
 			be0:	port@0 { be00_ep: endpoint { remote-endpoint = <&codec3_ep>; }; };
+			be1:	port@1 { be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
 			};
 		};
 	};
@@ -101,6 +131,8 @@ ports {
 			      port@2 { cpu2_ep: endpoint { remote-endpoint = <&mcpu2_ep>; }; };
 			      port@3 { cpu3_ep: endpoint { remote-endpoint = <&fe00_ep>; }; };
 			      port@4 { cpu4_ep: endpoint { remote-endpoint = <&fe01_ep>; }; };
+			      port@5 { cpu5_ep: endpoint { remote-endpoint = <&fe10_ep>; }; };
+			      port@6 { cpu6_ep: endpoint { remote-endpoint = <&fe11_ep>; }; };
 		};
 	};
 
@@ -124,6 +156,8 @@ ports {
 			port@1  { codec1_ep:  endpoint { remote-endpoint = <&mcodec1_ep>; }; };
 			port@2  { codec2_ep:  endpoint { remote-endpoint = <&mcodec2_ep>; }; };
 			port@3  { codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; }; };
+			port@4  { codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
+			port@5  { codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
 		};
 	};
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 15/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (13 preceding siblings ...)
  2021-09-10  1:23 ` [PATCH v3 14/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi) Kuninori Morimoto
@ 2021-09-10  1:23 ` Kuninori Morimoto
  2021-09-10  1:23 ` [PATCH v3 16/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi) Kuninori Morimoto
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:23 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Codec2Codec-Single sample to rich-graph-card-sample.dtsi.
Because it can use very basic connection only for now,
it can use only

	- 2channels
	- S32_LE format

Test-Component driver has "IN" and "OUT" widget. Thus the route is

	+--+
	|  | <-- Codec6 <-- IN
	|  | --> Codec7 --> OUT
	+--+

One note here is that it will start works when it boot.
In other words we can't stop it so far.
We need to update driver for it in the future.

	...
	asoc-rich-graph-card rich-graph-card-sample: test_codec.7 <-> test_codec.6 mapping ok
	test-component test_codec: test_dai_startup() : test_codec.6
	test-component test_codec: test_dai_startup() : test_codec.7
	...

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 23 ++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
index 25b9c52cb072..f67adae0322c 100644
--- a/sound/soc/generic/rich-graph-card-sample.dtsi
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -48,6 +48,11 @@ / {
 	 *	cpu5 <-@--*  *--@-> | | -> codec4
 	 *	cpu6 <-@--*  *	    | | -> codec5
 	 *		  ****	    +-+
+	 *
+	 * [Codec2Codec]
+	 *			   +-@-> codec6
+	 *			   |
+	 *			   +---> codec7
 	 */
 	rich-graph-card-sample {
 		/*
@@ -72,12 +77,16 @@ rich-graph-card-sample {
 			  "DAI5 Capture",	"TC DAI4 Capture",
 			  "DAI5 Capture",	"TC DAI5 Capture",
 			  "DAI6 Capture",	"TC DAI4 Capture",
-			  "DAI6 Capture",	"TC DAI5 Capture";
+			  "DAI6 Capture",	"TC DAI5 Capture",
+			/* for [Codec2Codec] */
+			  "TC OUT",		"TC DAI7 Playback",
+			  "TC DAI6 Capture",	"TC IN";
 
 		links = <&cpu0			/* normal: cpu side only */
 			 &mcpu0			/* multi:  cpu side only */
 			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
 			 &fe10 &fe11 &be1	/* dpcm-m: both FE / BE  */
+			 &c2c			/* c2c:    cpu side only */
 		>;
 
 		multi {
@@ -112,6 +121,14 @@ ports@1 {
 			be1:	port@1 { be10_ep: endpoint { remote-endpoint = <&mbe_ep>; }; };
 			};
 		};
+
+		codec2codec {
+			ports@0 {
+				rate = <48000>;
+			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
+				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
+			};
+		};
 	};
 
 	test_cpu {
@@ -158,6 +175,10 @@ ports {
 			port@3  { codec3_ep:  endpoint { remote-endpoint = <&be00_ep>; }; };
 			port@4  { codec4_ep:  endpoint { remote-endpoint = <&mbe1_ep>; }; };
 			port@5  { codec5_ep:  endpoint { remote-endpoint = <&mbe2_ep>; }; };
+			port@6  { bitclock-master;
+				  frame-master;
+				  codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
+			port@7  { codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
 		};
 	};
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* [PATCH v3 16/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi)
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (14 preceding siblings ...)
  2021-09-10  1:23 ` [PATCH v3 15/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single) Kuninori Morimoto
@ 2021-09-10  1:23 ` Kuninori Morimoto
  2021-09-29 22:23 ` [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
  2021-10-01  5:43 ` Péter Ujfalusi
  17 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-10  1:23 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds Codec2Codec-Multi sample to rich-graph-card-sample.dtsi.
Because it can use very basic connection only for now,
it can use only

	- 2channels
	- S32_LE format

Test-Component driver has "IN" and "OUT" widget. Thus the route is

	+--+    +-+
	|  |    | |- Codec8 <- IN
	|  | <- | |- Codec9 <- IN
	|  |    +-+
	|  |
	|  |    +-+
	|  | -> | |- Codec10 -> OUT
	|  |    | |- Codec11 -> OUT
	+--+    +-+

One note here is that it will start works when it boot.
In other words we can't stop it so far.
We need to update driver for it in the future.

	...
	asoc-rich-graph-card rich-graph-card-sample: multicodec <-> multicpu mapping ok
	test-component test_codec: test_dai_startup() : test_codec.9
	test-component test_codec: test_dai_startup() : test_codec.8
	test-component test_codec: test_dai_startup() : test_codec.11
	test-component test_codec: test_dai_startup() : test_codec.10
	...

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/generic/rich-graph-card-sample.dtsi | 43 ++++++++++++++++++-
 1 file changed, 42 insertions(+), 1 deletion(-)

diff --git a/sound/soc/generic/rich-graph-card-sample.dtsi b/sound/soc/generic/rich-graph-card-sample.dtsi
index f67adae0322c..902642e61882 100644
--- a/sound/soc/generic/rich-graph-card-sample.dtsi
+++ b/sound/soc/generic/rich-graph-card-sample.dtsi
@@ -53,6 +53,20 @@ / {
 	 *			   +-@-> codec6
 	 *			   |
 	 *			   +---> codec7
+	 *
+	 * [Codec2Codec-Multi]
+	 *
+	 * --NOTE--
+	 * Multi connect N:M is not supported by ASoC.
+	 *
+	 *				+-+
+	 *			   +-@->| |-> codec8
+	 *			   |	| |-> codec9
+	 *			   |	+-+
+	 *			   |	+-+
+	 *			   +--->| |-> codec10
+	 *				| |-> codec11
+	 *				+-+
 	 */
 	rich-graph-card-sample {
 		/*
@@ -80,13 +94,19 @@ rich-graph-card-sample {
 			  "DAI6 Capture",	"TC DAI5 Capture",
 			/* for [Codec2Codec] */
 			  "TC OUT",		"TC DAI7 Playback",
-			  "TC DAI6 Capture",	"TC IN";
+			  "TC DAI6 Capture",	"TC IN",
+			/* for [Codec2Codec-Multi] */
+			  "TC OUT",		"TC DAI10 Playback",
+			  "TC DAI8 Capture",	"TC IN",
+			  "TC OUT",		"TC DAI11 Playback",
+			  "TC DAI9 Capture",	"TC IN";
 
 		links = <&cpu0			/* normal: cpu side only */
 			 &mcpu0			/* multi:  cpu side only */
 			 &fe00 &fe01 &be0	/* dpcm:   both FE / BE  */
 			 &fe10 &fe11 &be1	/* dpcm-m: both FE / BE  */
 			 &c2c			/* c2c:    cpu side only */
+			 &c2c_m			/* c2c:    cpu side only */
 		>;
 
 		multi {
@@ -105,6 +125,16 @@ ports@2 {
 				port@1 { mbe1_ep: endpoint { remote-endpoint = <&codec4_ep>; }; };
 				port@2 { mbe2_ep: endpoint { remote-endpoint = <&codec5_ep>; }; };
 			};
+			ports@3 {
+				port@0 { mc2c0_ep:  endpoint { remote-endpoint = <&c2cmf_ep>;  }; };
+				port@1 { mc2c00_ep: endpoint { remote-endpoint = <&codec8_ep>; }; };
+				port@2 { mc2c01_ep: endpoint { remote-endpoint = <&codec9_ep>; }; };
+			};
+			ports@4 {
+				port@0 { mc2c1_ep:  endpoint { remote-endpoint = <&c2cmb_ep>;  }; };
+				port@1 { mc2c10_ep: endpoint { remote-endpoint = <&codec10_ep>; }; };
+				port@2 { mc2c11_ep: endpoint { remote-endpoint = <&codec11_ep>; }; };
+			};
 		};
 
 		dpcm {
@@ -128,6 +158,11 @@ ports@0 {
 			c2c:	port@0 { c2cf_ep: endpoint { remote-endpoint = <&codec6_ep>; }; };
 				port@1 { c2cb_ep: endpoint { remote-endpoint = <&codec7_ep>; }; };
 			};
+			ports@1 {
+				rate = <48000>;
+			c2c_m:	port@0 { c2cmf_ep: endpoint { remote-endpoint = <&mc2c0_ep>; }; };
+				port@1 { c2cmb_ep: endpoint { remote-endpoint = <&mc2c1_ep>; }; };
+			};
 		};
 	};
 
@@ -179,6 +214,12 @@ ports {
 				  frame-master;
 				  codec6_ep:  endpoint { remote-endpoint = <&c2cf_ep>; }; };
 			port@7  { codec7_ep:  endpoint { remote-endpoint = <&c2cb_ep>; }; };
+			port@8  { bitclock-master;
+				  frame-master;
+				  codec8_ep:  endpoint { remote-endpoint = <&mc2c00_ep>; }; };
+			port@9  { codec9_ep:  endpoint { remote-endpoint = <&mc2c01_ep>; }; };
+			port@10 { codec10_ep: endpoint { remote-endpoint = <&mc2c10_ep>; }; };
+			port@11 { codec11_ep: endpoint { remote-endpoint = <&mc2c11_ep>; }; };
 		};
 	};
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support
  2021-09-10  1:22 ` [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support Kuninori Morimoto
@ 2021-09-12  6:43     ` kernel test robot
  0 siblings, 0 replies; 33+ messages in thread
From: kernel test robot @ 2021-09-12  6:43 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: llvm, kbuild-all

[-- Attachment #1: Type: text/plain, Size: 6077 bytes --]

Hi Kuninori,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on asoc/for-next]
[also build test WARNING on sound/for-next v5.14 next-20210910]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: i386-randconfig-r005-20210912 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 261cbe98c38f8c1ee1a482fe76511110e790f58a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/75094c7c873a758d2196b5867d930669a15d2e20
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
        git checkout 75094c7c873a758d2196b5867d930669a15d2e20
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> sound/soc/generic/rich-graph-card.c:879:6: warning: variable 'ep0' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (!of_get_property(ports, "rate", &val)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:920:14: note: uninitialized use occurs here
           of_node_put(ep0);
                       ^~~
   sound/soc/generic/rich-graph-card.c:879:2: note: remove the 'if' if its condition is always false
           if (!of_get_property(ports, "rate", &val)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:854:25: note: initialize the variable 'ep0' to silence this warning
           struct device_node *ep0, *ep1;
                                  ^
                                   = NULL
>> sound/soc/generic/rich-graph-card.c:879:6: warning: variable 'ep1' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (!of_get_property(ports, "rate", &val)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:921:14: note: uninitialized use occurs here
           of_node_put(ep1);
                       ^~~
   sound/soc/generic/rich-graph-card.c:879:2: note: remove the 'if' if its condition is always false
           if (!of_get_property(ports, "rate", &val)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:854:31: note: initialize the variable 'ep1' to silence this warning
           struct device_node *ep0, *ep1;
                                        ^
                                         = NULL
   sound/soc/generic/rich-graph-card.c:1119:10: error: label at end of compound statement: expected statement
           default:
                   ^
                    ;
   2 warnings and 1 error generated.


vim +879 sound/soc/generic/rich-graph-card.c

   844	
   845	int rich_graph_link_c2c(struct asoc_simple_priv *priv,
   846				struct device_node *lnk,
   847				struct link_info *li)
   848	{
   849		struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
   850		struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
   851		struct snd_soc_pcm_stream *c2c_conf = dai_props->c2c_conf;
   852		struct device_node *port0, *port1, *ports;
   853		struct device_node *codec0_port, *codec1_port;
   854		struct device_node *ep0, *ep1;
   855		u32 val;
   856		int ret = -EINVAL;
   857	
   858		/*
   859		 * codec2codec {
   860		 *	ports {
   861		 *		rate = <48000>;
   862		 * =>	lnk:	port@0 { c2c0_ep: { ... = codec0_ep; }; };
   863		 *		port@1 { c2c1_ep: { ... = codec1_ep; }; };
   864		 *	};
   865		 * };
   866		 *
   867		 * Codec {
   868		 *	ports {
   869		 *		port@0 { codec0_ep: ... }; };
   870		 *		port@1 { codec1_ep: ... }; };
   871		 *	};
   872		 * };
   873		 */
   874		of_node_get(lnk);
   875		port0 = lnk;
   876		ports = of_get_parent(port0);
   877		port1 = of_get_next_child(ports, lnk);
   878	
 > 879		if (!of_get_property(ports, "rate", &val)) {
   880			struct device *dev = simple_priv_to_dev(priv);
   881	
   882			dev_err(dev, "Codec2Codec needs rate settings\n");
   883			goto err;
   884		}
   885	
   886		c2c_conf->formats	= SNDRV_PCM_FMTBIT_S32_LE; /* update ME */
   887		c2c_conf->rate_min	=
   888		c2c_conf->rate_max	= val;
   889		c2c_conf->channels_min	=
   890		c2c_conf->channels_max	= 2; /* update ME */
   891		dai_link->params	= c2c_conf;
   892	
   893		ep0 = port_to_endpoint(port0);
   894		ep1 = port_to_endpoint(port1);
   895	
   896		codec0_port = of_graph_get_remote_port(ep0);
   897		codec1_port = of_graph_get_remote_port(ep1);
   898	
   899		/*
   900		 * call Codec first.
   901		 * see
   902		 *	__graph_parse_node() :: DAI Naming
   903		 */
   904		ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0);
   905		if (ret < 0)
   906			goto err;
   907	
   908		/*
   909		 * call CPU, and set DAI Name
   910		 */
   911		ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1);
   912		if (ret < 0)
   913			goto err;
   914	
   915		graph_link_init(priv, codec0_port, li, 1);
   916	err:
   917		of_node_put(ports);
   918		of_node_put(port0);
   919		of_node_put(port1);
   920		of_node_put(ep0);
   921		of_node_put(ep1);
   922	
   923		return ret;
   924	}
   925	EXPORT_SYMBOL_GPL(rich_graph_link_c2c);
   926	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 40493 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support
@ 2021-09-12  6:43     ` kernel test robot
  0 siblings, 0 replies; 33+ messages in thread
From: kernel test robot @ 2021-09-12  6:43 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 6236 bytes --]

Hi Kuninori,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on asoc/for-next]
[also build test WARNING on sound/for-next v5.14 next-20210910]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: i386-randconfig-r005-20210912 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 261cbe98c38f8c1ee1a482fe76511110e790f58a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/75094c7c873a758d2196b5867d930669a15d2e20
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
        git checkout 75094c7c873a758d2196b5867d930669a15d2e20
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> sound/soc/generic/rich-graph-card.c:879:6: warning: variable 'ep0' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (!of_get_property(ports, "rate", &val)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:920:14: note: uninitialized use occurs here
           of_node_put(ep0);
                       ^~~
   sound/soc/generic/rich-graph-card.c:879:2: note: remove the 'if' if its condition is always false
           if (!of_get_property(ports, "rate", &val)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:854:25: note: initialize the variable 'ep0' to silence this warning
           struct device_node *ep0, *ep1;
                                  ^
                                   = NULL
>> sound/soc/generic/rich-graph-card.c:879:6: warning: variable 'ep1' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (!of_get_property(ports, "rate", &val)) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:921:14: note: uninitialized use occurs here
           of_node_put(ep1);
                       ^~~
   sound/soc/generic/rich-graph-card.c:879:2: note: remove the 'if' if its condition is always false
           if (!of_get_property(ports, "rate", &val)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   sound/soc/generic/rich-graph-card.c:854:31: note: initialize the variable 'ep1' to silence this warning
           struct device_node *ep0, *ep1;
                                        ^
                                         = NULL
   sound/soc/generic/rich-graph-card.c:1119:10: error: label at end of compound statement: expected statement
           default:
                   ^
                    ;
   2 warnings and 1 error generated.


vim +879 sound/soc/generic/rich-graph-card.c

   844	
   845	int rich_graph_link_c2c(struct asoc_simple_priv *priv,
   846				struct device_node *lnk,
   847				struct link_info *li)
   848	{
   849		struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, li->link);
   850		struct simple_dai_props *dai_props = simple_priv_to_props(priv, li->link);
   851		struct snd_soc_pcm_stream *c2c_conf = dai_props->c2c_conf;
   852		struct device_node *port0, *port1, *ports;
   853		struct device_node *codec0_port, *codec1_port;
   854		struct device_node *ep0, *ep1;
   855		u32 val;
   856		int ret = -EINVAL;
   857	
   858		/*
   859		 * codec2codec {
   860		 *	ports {
   861		 *		rate = <48000>;
   862		 * =>	lnk:	port(a)0 { c2c0_ep: { ... = codec0_ep; }; };
   863		 *		port(a)1 { c2c1_ep: { ... = codec1_ep; }; };
   864		 *	};
   865		 * };
   866		 *
   867		 * Codec {
   868		 *	ports {
   869		 *		port(a)0 { codec0_ep: ... }; };
   870		 *		port(a)1 { codec1_ep: ... }; };
   871		 *	};
   872		 * };
   873		 */
   874		of_node_get(lnk);
   875		port0 = lnk;
   876		ports = of_get_parent(port0);
   877		port1 = of_get_next_child(ports, lnk);
   878	
 > 879		if (!of_get_property(ports, "rate", &val)) {
   880			struct device *dev = simple_priv_to_dev(priv);
   881	
   882			dev_err(dev, "Codec2Codec needs rate settings\n");
   883			goto err;
   884		}
   885	
   886		c2c_conf->formats	= SNDRV_PCM_FMTBIT_S32_LE; /* update ME */
   887		c2c_conf->rate_min	=
   888		c2c_conf->rate_max	= val;
   889		c2c_conf->channels_min	=
   890		c2c_conf->channels_max	= 2; /* update ME */
   891		dai_link->params	= c2c_conf;
   892	
   893		ep0 = port_to_endpoint(port0);
   894		ep1 = port_to_endpoint(port1);
   895	
   896		codec0_port = of_graph_get_remote_port(ep0);
   897		codec1_port = of_graph_get_remote_port(ep1);
   898	
   899		/*
   900		 * call Codec first.
   901		 * see
   902		 *	__graph_parse_node() :: DAI Naming
   903		 */
   904		ret = graph_parse_node(priv, GRAPH_C2C, codec1_port, li, 0);
   905		if (ret < 0)
   906			goto err;
   907	
   908		/*
   909		 * call CPU, and set DAI Name
   910		 */
   911		ret = graph_parse_node(priv, GRAPH_C2C, codec0_port, li, 1);
   912		if (ret < 0)
   913			goto err;
   914	
   915		graph_link_init(priv, codec0_port, li, 1);
   916	err:
   917		of_node_put(ports);
   918		of_node_put(port0);
   919		of_node_put(port1);
   920		of_node_put(ep0);
   921		of_node_put(ep1);
   922	
   923		return ret;
   924	}
   925	EXPORT_SYMBOL_GPL(rich_graph_link_c2c);
   926	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 40493 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 05/16] ASoC: add Rich Graph Card driver
  2021-09-10  1:22 ` [PATCH v3 05/16] ASoC: add Rich Graph Card driver Kuninori Morimoto
@ 2021-09-12 10:24     ` kernel test robot
  0 siblings, 0 replies; 33+ messages in thread
From: kernel test robot @ 2021-09-12 10:24 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: llvm, kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2824 bytes --]

Hi Kuninori,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on asoc/for-next]
[also build test ERROR on sound/for-next v5.14 next-20210910]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: i386-randconfig-r005-20210912 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 261cbe98c38f8c1ee1a482fe76511110e790f58a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/b5ce49ac5dc76b68460729e0ec976c7f7ad870cf
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
        git checkout b5ce49ac5dc76b68460729e0ec976c7f7ad870cf
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> sound/soc/generic/rich-graph-card.c:511:10: error: label at end of compound statement: expected statement
           default:
                   ^
                    ;
   1 error generated.


vim +511 sound/soc/generic/rich-graph-card.c

   491	
   492	static int graph_count(struct asoc_simple_priv *priv,
   493			       struct graph_custom_hooks *hooks,
   494			       enum graph_type gtype,
   495			       struct device_node *lnk,
   496			       struct link_info *li)
   497	{
   498		struct device *dev = simple_priv_to_dev(priv);
   499		GRAPH_CUSTOM func = NULL;
   500		int ret = -EINVAL;
   501	
   502		if (li->link >= SNDRV_MAX_LINKS) {
   503			dev_err(dev, "too many links\n");
   504			return ret;
   505		}
   506	
   507		switch (gtype) {
   508		case GRAPH_NORMAL:
   509			func = graph_count_normal;
   510			break;
 > 511		default:
   512		}
   513	
   514		if (!func) {
   515			dev_err(dev, "non supported gtype (%d)\n", gtype);
   516			goto err;
   517		}
   518	
   519		ret = func(priv, lnk, li);
   520		if (ret < 0)
   521			goto err;
   522	
   523		li->link++;
   524	err:
   525		return ret;
   526	}
   527	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 40493 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 05/16] ASoC: add Rich Graph Card driver
@ 2021-09-12 10:24     ` kernel test robot
  0 siblings, 0 replies; 33+ messages in thread
From: kernel test robot @ 2021-09-12 10:24 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2906 bytes --]

Hi Kuninori,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on asoc/for-next]
[also build test ERROR on sound/for-next v5.14 next-20210910]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
base:   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: i386-randconfig-r005-20210912 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 261cbe98c38f8c1ee1a482fe76511110e790f58a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/b5ce49ac5dc76b68460729e0ec976c7f7ad870cf
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kuninori-Morimoto/ASoC-Add-Rich-Graph-Card-support/20210910-092924
        git checkout b5ce49ac5dc76b68460729e0ec976c7f7ad870cf
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> sound/soc/generic/rich-graph-card.c:511:10: error: label at end of compound statement: expected statement
           default:
                   ^
                    ;
   1 error generated.


vim +511 sound/soc/generic/rich-graph-card.c

   491	
   492	static int graph_count(struct asoc_simple_priv *priv,
   493			       struct graph_custom_hooks *hooks,
   494			       enum graph_type gtype,
   495			       struct device_node *lnk,
   496			       struct link_info *li)
   497	{
   498		struct device *dev = simple_priv_to_dev(priv);
   499		GRAPH_CUSTOM func = NULL;
   500		int ret = -EINVAL;
   501	
   502		if (li->link >= SNDRV_MAX_LINKS) {
   503			dev_err(dev, "too many links\n");
   504			return ret;
   505		}
   506	
   507		switch (gtype) {
   508		case GRAPH_NORMAL:
   509			func = graph_count_normal;
   510			break;
 > 511		default:
   512		}
   513	
   514		if (!func) {
   515			dev_err(dev, "non supported gtype (%d)\n", gtype);
   516			goto err;
   517		}
   518	
   519		ret = func(priv, lnk, li);
   520		if (ret < 0)
   521			goto err;
   522	
   523		li->link++;
   524	err:
   525		return ret;
   526	}
   527	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 40493 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (15 preceding siblings ...)
  2021-09-10  1:23 ` [PATCH v3 16/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi) Kuninori Morimoto
@ 2021-09-29 22:23 ` Kuninori Morimoto
  2021-09-30 12:15   ` Mark Brown
  2021-10-01  5:43 ` Péter Ujfalusi
  17 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-29 22:23 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

2 weeks have passed, and nothing happened.
Do I need to repost this patch-set ?

> Hi Mark
> 
> We already have Audio-Graph-Card which is Of-Graph base general sound
> card driver. Basically it supports basic CPU-Codec connection, and is
> also supporting DPCM connection. Because it was forcibly expanded to
> DPCM, DT parsing is very limited and very difficult to add new features
> on it, for example Multi-CPU/Codec support, Codec2Codec support, etc.
> 
> This patch adds more flexible new Rich-Graph-Card driver for it.
> Audio-Graph-Card and Rich-Graph-Card are similar, but don't have
> full compatibility.
> The reason why I need Rich-Graph-Card instead of updating Audio-Graph-Card
> is that it is very difficult to keep compatibility.
> 
> Rich-Graph-Card supports Normal/DPCM/Codec2Codec Connection wich
> Single/Multi DAIs. And it is possible to Customizing.
> 
> This patch-set adds Rich-Graph-Card driver and customized driver
> sample, and DT settings sample which can be used for testing.
> 
> To enable testing/debuging, this patch-set also adds Test-Component
> driver. We already have Dummy Component and/or Dummy DAI on soc-utils,
> but 1) we can't use it from DT, 2) it do nothing.
> Added new Test-Component can be used from DT, and it can indicate called
> function name. We can use it to trace callback order, understanding
> ALSA SoC behavior, etc, etc...
> Sample DT settings of Rich Graph Card is using Test-Component as CPU/Codec DAI.
> 
> You can easily try to use/test it if you added below line to your DT file.
> Your .config needs to have below CONFIGs to use/test it.
> It will probe sample Sound Card which has Normal/DPCM/Multi/Codec2Codec
> connections.
> 
> 	#include "../../../../../sound/soc/generic/rich-graph-card-sample.dtsi"
> 
> 	CONFIG_SND_RICH_GRAPH_CARD
> 	CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE
> 	CONFIG_SND_TEST_COMPONENT
> 
> Because Audio Graph Card2 is still under experimental stage, it will
> indicate such warning when probing, and the DT might be updated/exchanged.
> 
> It can use Codec2Codec, but it will start automatically when probed,
> and can't stop it so far. It should be updated.
> 
> Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
> Link: https://lore.kernel.org/r/871r8u4s6q.wl-kuninori.morimoto.gx@renesas.com
> Link: https://lore.kernel.org/r/87a6mhwyqn.wl-kuninori.morimoto.gx@renesas.com
> 
> v1 -> v2
> 	- don't use "port" base for_each loop
> 
> v2 -> v3
> 	- Rename audio-graph-card2 to rich-graph-card
> 	- Rename DSP to DPCM not to confuse
> 	- Normal/DPCM/Codec2Codec can use Single/Multi DAIs.
> 	- use dpcm/multi/codec2codec node instead of using extra compatible
> 	- Sample DTSI patch is separated to Single/Multi.
> 
> Kuninori Morimoto (16):
>   ASoC: test-component: add Test Component YAML bindings
>   ASoC: test-component: add Test Component for Sound debug/test
>   ASoC: simple-card-utils: add asoc_graph_is_ports0()
>   ASoC: simple-card-utils: add codec2codec support
>   ASoC: add Rich Graph Card driver
>   ASoC: rich-graph-card: add Multi CPU/Codec support
>   ASoC: rich-graph-card: add DPCM support
>   ASoC: rich-graph-card: add Codec2Codec support
>   ASoC: add Rich Graph Card Yaml Document
>   ASoC: add Rich Graph Card Custom Sample
>   ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single)
>   ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti)
>   ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single)
>   ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi)
>   ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single)
>   ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi)
> 
>  .../bindings/sound/rich-graph-card.yaml       |   57 +
>  .../bindings/sound/test-component.yaml        |   33 +
>  include/sound/graph_card.h                    |   21 +
>  include/sound/simple_card_utils.h             |    4 +
>  sound/soc/generic/Kconfig                     |   20 +
>  sound/soc/generic/Makefile                    |    6 +
>  sound/soc/generic/rich-custom-card-sample.c   |  174 +++
>  sound/soc/generic/rich-graph-card-sample.dtsi |  225 +++
>  sound/soc/generic/rich-graph-card.c           | 1277 +++++++++++++++++
>  sound/soc/generic/simple-card-utils.c         |   46 +-
>  sound/soc/generic/test-component.c            |  659 +++++++++
>  11 files changed, 2521 insertions(+), 1 deletion(-)
>  create mode 100644 Documentation/devicetree/bindings/sound/rich-graph-card.yaml
>  create mode 100644 Documentation/devicetree/bindings/sound/test-component.yaml
>  create mode 100644 sound/soc/generic/rich-custom-card-sample.c
>  create mode 100644 sound/soc/generic/rich-graph-card-sample.dtsi
>  create mode 100644 sound/soc/generic/rich-graph-card.c
>  create mode 100644 sound/soc/generic/test-component.c
> 
> -- 
> 2.25.1
> 

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-09-29 22:23 ` [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
@ 2021-09-30 12:15   ` Mark Brown
  2021-09-30 22:38     ` Kuninori Morimoto
  0 siblings, 1 reply; 33+ messages in thread
From: Mark Brown @ 2021-09-30 12:15 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA

[-- Attachment #1: Type: text/plain, Size: 351 bytes --]

On Thu, Sep 30, 2021 at 07:23:06AM +0900, Kuninori Morimoto wrote:

> 2 weeks have passed, and nothing happened.
> Do I need to repost this patch-set ?

No, it's still in my queue - I'm hoping to get to it this week, between
Plumbers last week and a big internal conference the week before I've
not had much bandwidth for complicated stuff like this.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-09-30 12:15   ` Mark Brown
@ 2021-09-30 22:38     ` Kuninori Morimoto
  0 siblings, 0 replies; 33+ messages in thread
From: Kuninori Morimoto @ 2021-09-30 22:38 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

Thank you for your reply

> > 2 weeks have passed, and nothing happened.
> > Do I need to repost this patch-set ?
> 
> No, it's still in my queue - I'm hoping to get to it this week, between
> Plumbers last week and a big internal conference the week before I've
> not had much bandwidth for complicated stuff like this.

Oh, I see.
Thank you for your help !!

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
                   ` (16 preceding siblings ...)
  2021-09-29 22:23 ` [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
@ 2021-10-01  5:43 ` Péter Ujfalusi
  2021-10-01  6:48   ` Kuninori Morimoto
  17 siblings, 1 reply; 33+ messages in thread
From: Péter Ujfalusi @ 2021-10-01  5:43 UTC (permalink / raw)
  To: Kuninori Morimoto, Mark Brown; +Cc: Linux-ALSA, Rob Herring

Hi Morimoto-san, Mark,

On 10/09/2021 04:20, Kuninori Morimoto wrote:
> 
> Hi Mark
> 
> We already have Audio-Graph-Card which is Of-Graph base general sound
> card driver. Basically it supports basic CPU-Codec connection, and is
> also supporting DPCM connection. Because it was forcibly expanded to
> DPCM, DT parsing is very limited and very difficult to add new features
> on it, for example Multi-CPU/Codec support, Codec2Codec support, etc.
> 
> This patch adds more flexible new Rich-Graph-Card driver for it.
> Audio-Graph-Card and Rich-Graph-Card are similar, but don't have
> full compatibility.
> The reason why I need Rich-Graph-Card instead of updating Audio-Graph-Card
> is that it is very difficult to keep compatibility.
> 
> Rich-Graph-Card supports Normal/DPCM/Codec2Codec Connection wich
> Single/Multi DAIs. And it is possible to Customizing.
> 
> This patch-set adds Rich-Graph-Card driver and customized driver
> sample, and DT settings sample which can be used for testing.

I understand is that naming is difficult, but a rich-graph-card sounds a
bit awkward?
Will we see a wealthy-graph-card if the rich is not resourceful enough? ;)

The current generation of graph based generic audio card is
audio-graph-card

This is going to be an (incompatible) evolution, the Next/New
Generation. Would it sound better if it is named
audio-graph-card-ng / ng-audio-graph-card

The 'rich' sound really out of place (if not rich then poor?).

Next Generation, New Generation, Extended, etc
or just drop the graph and
generic-audio-card


> To enable testing/debuging, this patch-set also adds Test-Component
> driver. We already have Dummy Component and/or Dummy DAI on soc-utils,
> but 1) we can't use it from DT, 2) it do nothing.
> Added new Test-Component can be used from DT, and it can indicate called
> function name. We can use it to trace callback order, understanding
> ALSA SoC behavior, etc, etc...
> Sample DT settings of Rich Graph Card is using Test-Component as CPU/Codec DAI.
> 
> You can easily try to use/test it if you added below line to your DT file.
> Your .config needs to have below CONFIGs to use/test it.
> It will probe sample Sound Card which has Normal/DPCM/Multi/Codec2Codec
> connections.
> 
> 	#include "../../../../../sound/soc/generic/rich-graph-card-sample.dtsi"
> 
> 	CONFIG_SND_RICH_GRAPH_CARD
> 	CONFIG_SND_RICH_CUSTOM_CARD_SAMPLE
> 	CONFIG_SND_TEST_COMPONENT
> 
> Because Audio Graph Card2 is still under experimental stage, it will
> indicate such warning when probing, and the DT might be updated/exchanged.
> 
> It can use Codec2Codec, but it will start automatically when probed,
> and can't stop it so far. It should be updated.
> 
> Link: https://lore.kernel.org/r/87k0xszlep.wl-kuninori.morimoto.gx@renesas.com
> Link: https://lore.kernel.org/r/871r8u4s6q.wl-kuninori.morimoto.gx@renesas.com
> Link: https://lore.kernel.org/r/87a6mhwyqn.wl-kuninori.morimoto.gx@renesas.com
> 
> v1 -> v2
> 	- don't use "port" base for_each loop
> 
> v2 -> v3
> 	- Rename audio-graph-card2 to rich-graph-card
> 	- Rename DSP to DPCM not to confuse
> 	- Normal/DPCM/Codec2Codec can use Single/Multi DAIs.
> 	- use dpcm/multi/codec2codec node instead of using extra compatible
> 	- Sample DTSI patch is separated to Single/Multi.
> 
> Kuninori Morimoto (16):
>   ASoC: test-component: add Test Component YAML bindings
>   ASoC: test-component: add Test Component for Sound debug/test
>   ASoC: simple-card-utils: add asoc_graph_is_ports0()
>   ASoC: simple-card-utils: add codec2codec support
>   ASoC: add Rich Graph Card driver
>   ASoC: rich-graph-card: add Multi CPU/Codec support
>   ASoC: rich-graph-card: add DPCM support
>   ASoC: rich-graph-card: add Codec2Codec support
>   ASoC: add Rich Graph Card Yaml Document
>   ASoC: add Rich Graph Card Custom Sample
>   ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single)
>   ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti)
>   ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single)
>   ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi)
>   ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single)
>   ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi)
> 
>  .../bindings/sound/rich-graph-card.yaml       |   57 +
>  .../bindings/sound/test-component.yaml        |   33 +
>  include/sound/graph_card.h                    |   21 +
>  include/sound/simple_card_utils.h             |    4 +
>  sound/soc/generic/Kconfig                     |   20 +
>  sound/soc/generic/Makefile                    |    6 +
>  sound/soc/generic/rich-custom-card-sample.c   |  174 +++
>  sound/soc/generic/rich-graph-card-sample.dtsi |  225 +++
>  sound/soc/generic/rich-graph-card.c           | 1277 +++++++++++++++++
>  sound/soc/generic/simple-card-utils.c         |   46 +-
>  sound/soc/generic/test-component.c            |  659 +++++++++
>  11 files changed, 2521 insertions(+), 1 deletion(-)
>  create mode 100644 Documentation/devicetree/bindings/sound/rich-graph-card.yaml
>  create mode 100644 Documentation/devicetree/bindings/sound/test-component.yaml
>  create mode 100644 sound/soc/generic/rich-custom-card-sample.c
>  create mode 100644 sound/soc/generic/rich-graph-card-sample.dtsi
>  create mode 100644 sound/soc/generic/rich-graph-card.c
>  create mode 100644 sound/soc/generic/test-component.c
> 

-- 
Péter

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-10-01  5:43 ` Péter Ujfalusi
@ 2021-10-01  6:48   ` Kuninori Morimoto
  2021-10-01 20:01     ` Mark Brown
  0 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-10-01  6:48 UTC (permalink / raw)
  To: Péter Ujfalusi; +Cc: Linux-ALSA, Mark Brown, Rob Herring


Hi Peter, Mark

Thank you for your feedback

> I understand is that naming is difficult, but a rich-graph-card sounds a
> bit awkward?
> Will we see a wealthy-graph-card if the rich is not resourceful enough? ;)
> 
> The current generation of graph based generic audio card is
> audio-graph-card
> 
> This is going to be an (incompatible) evolution, the Next/New
> Generation. Would it sound better if it is named
> audio-graph-card-ng / ng-audio-graph-card
> 
> The 'rich' sound really out of place (if not rich then poor?).
> 
> Next Generation, New Generation, Extended, etc
> or just drop the graph and
> generic-audio-card

To be honest, I don't think this version will be final version of
Generic audio card driver.
We will want to have more advanced generic audio card if framework was updated,
and/or new feature was added, and/or want to use more complex connection,
etc, etc, etc...

In such case, because of Device-Tree, it is very difficult to update driver
with keeping compatibility.
This means, we need to keep old version generic audio card as-is,
and add new generic audio card, like this version.

New / Next / Extended / Rich are not best naming IMO.
For example, we will confuse if we add new generic audio card at
10 years later (It should be more new/next/extended/rich than this version).

And yes, people should not feel bad from driver naming.

Thus, my honest opinion is that using v2, v3, ... is easy to understand,
especially for audio-graph-card. (audio-graph-card2, audio-graph-card3, ...)

But, any naming is very welcome for me if Mark and/or all people are accepted.

Thank you for your help !!

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-10-01  6:48   ` Kuninori Morimoto
@ 2021-10-01 20:01     ` Mark Brown
  2021-10-03 23:52       ` Kuninori Morimoto
  0 siblings, 1 reply; 33+ messages in thread
From: Mark Brown @ 2021-10-01 20:01 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Rob Herring, Péter Ujfalusi

[-- Attachment #1: Type: text/plain, Size: 1275 bytes --]

On Fri, Oct 01, 2021 at 03:48:26PM +0900, Kuninori Morimoto wrote:

> > The current generation of graph based generic audio card is
> > audio-graph-card

> > This is going to be an (incompatible) evolution, the Next/New
> > Generation. Would it sound better if it is named
> > audio-graph-card-ng / ng-audio-graph-card

> > The 'rich' sound really out of place (if not rich then poor?).

Wealthy, billionaire, oligarch...  :P

> > Next Generation, New Generation, Extended, etc
> > or just drop the graph and
> > generic-audio-card

> To be honest, I don't think this version will be final version of
> Generic audio card driver.
> We will want to have more advanced generic audio card if framework was updated,
> and/or new feature was added, and/or want to use more complex connection,
> etc, etc, etc...

> Thus, my honest opinion is that using v2, v3, ... is easy to understand,
> especially for audio-graph-card. (audio-graph-card2, audio-graph-card3, ...)

I think part of the thing that pushed me towards suggesting a more
descriptive name was that your original posting made it sound like this
wasn't going to replace the existing card for all applications which
looking again isn't really the case and just numbering might be better.
Sorry about the hassle there :/

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings
  2021-09-10  1:21 ` [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings Kuninori Morimoto
@ 2021-10-01 20:11   ` Mark Brown
  0 siblings, 0 replies; 33+ messages in thread
From: Mark Brown @ 2021-10-01 20:11 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA

[-- Attachment #1: Type: text/plain, Size: 344 bytes --]

On Fri, Sep 10, 2021 at 10:21:37AM +0900, Kuninori Morimoto wrote:

> +    enum:
> +      - test-cpu
> +      - test-cpu-vv
> +      - test-cpu-vn
> +      - test-cpu-nv
> +      - test-codec
> +      - test-codec-vv
> +      - test-codec-vn
> +      - test-codec-nv

I do think we need some words in the binding document about what these
are.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document
  2021-09-10  1:22 ` [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document Kuninori Morimoto
@ 2021-10-01 21:06   ` Mark Brown
  2021-10-04  1:50     ` Kuninori Morimoto
  0 siblings, 1 reply; 33+ messages in thread
From: Mark Brown @ 2021-10-01 21:06 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA

[-- Attachment #1: Type: text/plain, Size: 756 bytes --]

On Fri, Sep 10, 2021 at 10:22:39AM +0900, Kuninori Morimoto wrote:

> +  multi:
> +    description: Multi-CPU/Codec node
> +  dpcm:
> +    description: DPCM node
> +  codec2codec:
> +    description: Codec to Codec node

I think I need to have another look through this sometime next week but
other than the naming thing discussed in the other subthread I think the
only issues I see at a high level are the standard concern about putting
DPCM into an ABI which I think we're stuck with having to do right now,
and also if we can merge multi and CODEC-CODEC links more.  There's bits
you've called out in your changelog as needing further work but I think
it's OK to add things incrementally.

Overall it's looking pretty good, thanks for working on this.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-10-01 20:01     ` Mark Brown
@ 2021-10-03 23:52       ` Kuninori Morimoto
  2021-10-04 16:54         ` Mark Brown
  0 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-10-03 23:52 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Rob Herring, Péter Ujfalusi


Hi Mark

Thank you for your feedback

> Wealthy, billionaire, oligarch...  :P

audio-graph-billionaire-card... sound good :)

> > To be honest, I don't think this version will be final version of
> > Generic audio card driver.
> > We will want to have more advanced generic audio card if framework was updated,
> > and/or new feature was added, and/or want to use more complex connection,
> > etc, etc, etc...
> 
> > Thus, my honest opinion is that using v2, v3, ... is easy to understand,
> > especially for audio-graph-card. (audio-graph-card2, audio-graph-card3, ...)
> 
> I think part of the thing that pushed me towards suggesting a more
> descriptive name was that your original posting made it sound like this
> wasn't going to replace the existing card for all applications which
> looking again isn't really the case and just numbering might be better.
> Sorry about the hassle there :/

Sorry for the confusion.
If you are OK, I want to use audio-graph-card2 at v4 patch.

Thank you for your help !!

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document
  2021-10-01 21:06   ` Mark Brown
@ 2021-10-04  1:50     ` Kuninori Morimoto
  2021-10-05 17:26       ` Mark Brown
  0 siblings, 1 reply; 33+ messages in thread
From: Kuninori Morimoto @ 2021-10-04  1:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

Thank you for your reply

> > +  multi:
> > +    description: Multi-CPU/Codec node
> > +  dpcm:
> > +    description: DPCM node
> > +  codec2codec:
> > +    description: Codec to Codec node
> 
> I think I need to have another look through this sometime next week but
> other than the naming thing discussed in the other subthread I think the
> only issues I see at a high level are the standard concern about putting
> DPCM into an ABI which I think we're stuck with having to do right now,
> and also if we can merge multi and CODEC-CODEC links more.  There's bits
> you've called out in your changelog as needing further work but I think
> it's OK to add things incrementally.
> 
> Overall it's looking pretty good, thanks for working on this.

Thank you.
I'm looking forward to your detail review,
and happy to create v4

Thank you for your help !!

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 00/16] ASoC: Add Rich Graph Card support
  2021-10-03 23:52       ` Kuninori Morimoto
@ 2021-10-04 16:54         ` Mark Brown
  0 siblings, 0 replies; 33+ messages in thread
From: Mark Brown @ 2021-10-04 16:54 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Rob Herring, Péter Ujfalusi

[-- Attachment #1: Type: text/plain, Size: 184 bytes --]

On Mon, Oct 04, 2021 at 08:52:44AM +0900, Kuninori Morimoto wrote:

> If you are OK, I want to use audio-graph-card2 at v4 patch.

Yes, that sounds the best option we've come up with.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

* Re: [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document
  2021-10-04  1:50     ` Kuninori Morimoto
@ 2021-10-05 17:26       ` Mark Brown
  0 siblings, 0 replies; 33+ messages in thread
From: Mark Brown @ 2021-10-05 17:26 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA

[-- Attachment #1: Type: text/plain, Size: 213 bytes --]

On Mon, Oct 04, 2021 at 10:50:44AM +0900, Kuninori Morimoto wrote:

> I'm looking forward to your detail review,
> and happy to create v4

Please just go ahead and send v4, I don't think I've got anything
really.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 33+ messages in thread

end of thread, other threads:[~2021-10-05 17:27 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-10  1:20 [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
2021-09-10  1:21 ` [PATCH v3 01/16] ASoC: test-component: add Test Component YAML bindings Kuninori Morimoto
2021-10-01 20:11   ` Mark Brown
2021-09-10  1:21 ` [PATCH v3 02/16] ASoC: test-component: add Test Component for Sound debug/test Kuninori Morimoto
2021-09-10  1:21 ` [PATCH v3 03/16] ASoC: simple-card-utils: add asoc_graph_is_ports0() Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 04/16] ASoC: simple-card-utils: add codec2codec support Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 05/16] ASoC: add Rich Graph Card driver Kuninori Morimoto
2021-09-12 10:24   ` kernel test robot
2021-09-12 10:24     ` kernel test robot
2021-09-10  1:22 ` [PATCH v3 06/16] ASoC: rich-graph-card: add Multi CPU/Codec support Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 07/16] ASoC: rich-graph-card: add DPCM support Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 08/16] ASoC: rich-graph-card: add Codec2Codec support Kuninori Morimoto
2021-09-12  6:43   ` kernel test robot
2021-09-12  6:43     ` kernel test robot
2021-09-10  1:22 ` [PATCH v3 09/16] ASoC: add Rich Graph Card Yaml Document Kuninori Morimoto
2021-10-01 21:06   ` Mark Brown
2021-10-04  1:50     ` Kuninori Morimoto
2021-10-05 17:26       ` Mark Brown
2021-09-10  1:22 ` [PATCH v3 10/16] ASoC: add Rich Graph Card Custom Sample Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 11/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Single) Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 12/16] ASoC: rich-graph-card-sample.dtsi: add Sample DT for Normal (Nulti) Kuninori Morimoto
2021-09-10  1:22 ` [PATCH v3 13/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Single) Kuninori Morimoto
2021-09-10  1:23 ` [PATCH v3 14/16] ASoC: rich-graph-card-sample.dtsi: add DPCM sample (Multi) Kuninori Morimoto
2021-09-10  1:23 ` [PATCH v3 15/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Single) Kuninori Morimoto
2021-09-10  1:23 ` [PATCH v3 16/16] ASoC: rich-graph-card-sample.dtsi: add Codec2Codec sample (Multi) Kuninori Morimoto
2021-09-29 22:23 ` [PATCH v3 00/16] ASoC: Add Rich Graph Card support Kuninori Morimoto
2021-09-30 12:15   ` Mark Brown
2021-09-30 22:38     ` Kuninori Morimoto
2021-10-01  5:43 ` Péter Ujfalusi
2021-10-01  6:48   ` Kuninori Morimoto
2021-10-01 20:01     ` Mark Brown
2021-10-03 23:52       ` Kuninori Morimoto
2021-10-04 16:54         ` Mark Brown

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.