[alsa-devel] [PATCH v3][RFC] ASoC: soc.h: add sound dai_link connection macro

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Fri Apr 19 06:41:04 CEST 2019


Modern style dai_link requests CPU/Codec/Platform component
pointer array and its size, but it will be very verbose code.
To avoid such scene, this patch adds dai_link connection macro.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 include/sound/soc.h  | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 sound/soc/soc-core.c |  6 ++++
 2 files changed, 94 insertions(+)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index 23463ba..da6c386 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -1043,6 +1043,94 @@ struct snd_soc_dai_link {
 	     ((i) < link->num_codecs) && ((codec) = &link->codecs[i]);	\
 	     (i)++)
 
+/*
+ * Sample 1 : Single CPU/Codec/Platform
+ *
+ * SND_SOC_DAILINK_DEFS(test,
+ *	DAILINK_COMPONENT_ARRAY(COMPONENT_CPU("cpu_dai")),
+ *	DAILINK_COMPONENT_ARRAY(COMPONENT_CODEC("codec", "codec_dai")),
+ *	DAILINK_COMPONENT_ARRAY(COMPONENT_PLATFORM("platform")));
+ *
+ * struct snd_soc_dai_link link = {
+ *	...
+ *	SND_SOC_DAILINK_REG(test),
+ * };
+ *
+ * Sample 2 : Multi CPU/Codec, no Platform
+ *
+ * SND_SOC_DAILINK_DEFS(test,
+ *	DAILINK_COMPONENT_ARRAY(COMPONENT_CPU("cpu_dai1"),
+ *				COMPONENT_CPU("cpu_dai2")),
+ *	DAILINK_COMPONENT_ARRAY(COMPONENT_CODEC("codec1", "codec_dai1"),
+ *				COMPONENT_CODEC("codec2", "codec_dai2")));
+ *
+ * struct snd_soc_dai_link link = {
+ *	...
+ *	SND_SOC_DAILINK_REG(test),
+ * };
+ *
+ * Sample3. Define each CPU/Codec/Platform manually
+ *
+ * SND_SOC_DAILINK_DEF(test_cpu,
+ *		DAILINK_COMPONENT_ARRAY(COMPONENT_CPU("cpu_dai1"),
+ *					COMPONENT_CPU("cpu_dai2")));
+ * SND_SOC_DAILINK_DEF(test_codec,
+ *		DAILINK_COMPONENT_ARRAY(COMPONENT_CODEC("codec1", "codec_dai1"),
+ *					COMPONENT_CODEC("codec2", "codec_dai2")));
+ * SND_SOC_DAILINK_DEF(test_platform,
+ *		DAILINK_COMPONENT_ARRAY(COMPONENT_PLATFORM("platform")));
+ *
+ * struct snd_soc_dai_link link = {
+ *	...
+ *	SND_SOC_DAILINK_REG(test_cpu,
+ *			    test_codec,
+ *			    test_platform),
+ * };
+ *
+ * Sample4. Sample3 without platform
+ *
+ * struct snd_soc_dai_link link = {
+ *	...
+ *	SND_SOC_DAILINK_REG(test_cpu,
+ *			    test_codec);
+ * };
+ */
+
+#define SND_SOC_DAILINK_REG1(name)	 SND_SOC_DAILINK_REG3(name##_cpus, name##_codecs, name##_platforms)
+#define SND_SOC_DAILINK_REG2(cpu, codec) SND_SOC_DAILINK_REG3(cpu, codec, null_dailink_component)
+#define SND_SOC_DAILINK_REG3(cpu, codec, platform)	\
+	.cpus		= cpu,				\
+	.num_cpus	= ARRAY_SIZE(cpu),		\
+	.codecs		= codec,			\
+	.num_codecs	= ARRAY_SIZE(codec),		\
+	.platforms	= platform,			\
+	.num_platforms	= ARRAY_SIZE(platform)
+
+#define SND_SOC_DAILINK_REG_FUNC(_1, _2, _3, func, ...) func
+#define SND_SOC_DAILINK_REG(...) \
+	SND_SOC_DAILINK_REG_FUNC(__VA_ARGS__,		\
+				 SND_SOC_DAILINK_REG3,	\
+				 SND_SOC_DAILINK_REG2,	\
+				 SND_SOC_DAILINK_REG1)(__VA_ARGS__)
+
+#define SND_SOC_DAILINK_DEF(name, def...)		\
+	static struct snd_soc_dai_link_component name[]	= { def }
+
+#define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...)	\
+	SND_SOC_DAILINK_DEF(name##_cpus, cpu);			\
+	SND_SOC_DAILINK_DEF(name##_codecs, codec);		\
+	SND_SOC_DAILINK_DEF(name##_platforms, platform)
+
+#define DAILINK_COMPONENT_ARRAY(param...)	param
+#define COMPONENT_EMPTY()			{ }
+#define COMPONENT_CPU(_dai)			{ .dai_name = _dai, }
+#define COMPONENT_CODEC(_name, _dai)		{ .name = _name, .dai_name = _dai, }
+#define COMPONENT_PLATFORM(_name)		{ .name = _name }
+#define COMPONENT_DUMMY()			{ .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
+
+extern struct snd_soc_dai_link_component null_dailink_component[0];
+
+
 struct snd_soc_codec_conf {
 	/*
 	 * specify device either by device name, or by
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 4c1fdad..8cb7b10 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -58,6 +58,12 @@ static LIST_HEAD(unbind_card_list);
 	list_for_each_entry(component, &component_list, list)
 
 /*
+ * This is used if driver don't need to have CPU/Codec/Platform
+ * dai_link. see soc.h
+ */
+struct snd_soc_dai_link_component null_dailink_component[0];
+
+/*
  * This is a timeout to do a DAPM powerdown after a stream is closed().
  * It can be used to eliminate pops between different playback streams, e.g.
  * between two audio tracks.
-- 
2.7.4



More information about the Alsa-devel mailing list