ASoC: soc.h: add sound dai_link connection macro
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 6 Jun 2019 04:07:42 +0000 (13:07 +0900)
committerMark Brown <broonie@kernel.org>
Thu, 6 Jun 2019 20:22:42 +0000 (21:22 +0100)
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@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc.h
sound/soc/soc-core.c

index ae7ca828e167acc8f439b567e84a24ae5476c21c..0fa79b8330d79e54431695afc6e924edd48142d3 100644 (file)
@@ -1048,6 +1048,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_COMP_ARRAY(COMP_CPU("cpu_dai")),
+ *     DAILINK_COMP_ARRAY(COMP_CODEC("codec", "codec_dai")),
+ *     DAILINK_COMP_ARRAY(COMP_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_COMP_ARRAY(COMP_CPU("cpu_dai1"),
+ *                        COMP_CPU("cpu_dai2")),
+ *     DAILINK_COMP_ARRAY(COMP_CODEC("codec1", "codec_dai1"),
+ *                        COMP_CODEC("codec2", "codec_dai2")));
+ *
+ * struct snd_soc_dai_link link = {
+ *     ...
+ *     SND_SOC_DAILINK_REG(test),
+ * };
+ *
+ * Sample 3 : Define each CPU/Codec/Platform manually
+ *
+ * SND_SOC_DAILINK_DEF(test_cpu,
+ *             DAILINK_COMP_ARRAY(COMP_CPU("cpu_dai1"),
+ *                                COMP_CPU("cpu_dai2")));
+ * SND_SOC_DAILINK_DEF(test_codec,
+ *             DAILINK_COMP_ARRAY(COMP_CODEC("codec1", "codec_dai1"),
+ *                                COMP_CODEC("codec2", "codec_dai2")));
+ * SND_SOC_DAILINK_DEF(test_platform,
+ *             DAILINK_COMP_ARRAY(COMP_PLATFORM("platform")));
+ *
+ * struct snd_soc_dai_link link = {
+ *     ...
+ *     SND_SOC_DAILINK_REG(test_cpu,
+ *                         test_codec,
+ *                         test_platform),
+ * };
+ *
+ * Sample 4 : 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_REGx(_1, _2, _3, func, ...) func
+#define SND_SOC_DAILINK_REG(...) \
+       SND_SOC_DAILINK_REGx(__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_COMP_ARRAY(param...)   param
+#define COMP_EMPTY()                   { }
+#define COMP_CPU(_dai)                 { .dai_name = _dai, }
+#define COMP_CODEC(_name, _dai)                { .name = _name, .dai_name = _dai, }
+#define COMP_PLATFORM(_name)           { .name = _name }
+#define COMP_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
index f86ee4f48f06f0be8fdad5c6127d802793b43acc..9bd6b08d79b55831f06831fb7cdd8605efe84ecc 100644 (file)
@@ -57,6 +57,13 @@ static LIST_HEAD(unbind_card_list);
 #define for_each_component(component)                  \
        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];
+EXPORT_SYMBOL_GPL(null_dailink_component);
+
 /*
  * 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.