forked from Minki/linux
ASoC: soc.h: add sound dai_link connection macro
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>
This commit is contained in:
parent
f107294c64
commit
587c984427
@ -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
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user