--- Begin Message ---
- To: Herve Codina <herve.codina@xxxxxxxxxxx>, Liam Girdwood <lgirdwood@xxxxxxxxx>, Mark Brown <broonie@xxxxxxxxxx>, Rob Herring <robh+dt@xxxxxxxxxx>, Krzysztof Kozlowski <krzysztof.kozlowski+dt@xxxxxxxxxx>, Jonathan Cameron <jic23@xxxxxxxxxx>, Lars-Peter Clausen <lars@xxxxxxxxxx>, Jaroslav Kysela <perex@xxxxxxxx>, Takashi Iwai <tiwai@xxxxxxxx>
- Subject: [PATCH 3/4] ASoC: soc-dapm.h: Add a helper to build a DAPM widget dynamically
- From: Herve Codina <herve.codina@xxxxxxxxxxx>
- Date: Fri, 21 Apr 2023 14:41:21 +0200
- Cc: alsa-devel@xxxxxxxxxxxxxxxx, devicetree@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, linux-iio@xxxxxxxxxxxxxxx, Christophe Leroy <christophe.leroy@xxxxxxxxxx>, Thomas Petazzoni <thomas.petazzoni@xxxxxxxxxxx>
- In-reply-to: <20230421124122.324820-1-herve.codina@bootlin.com>
- References: <20230421124122.324820-1-herve.codina@bootlin.com>
The SND_SOC_DAPM_* helpers family are used to build widgets array in a
static way.
Introduce SND_SOC_DAPM_WIDGET() in order to use the SND_SOC_DAPM_*
helpers family in a dynamic way. The different SND_SOC_DAPM_* parameters
can be computed by the code and the widget can be built based on this
parameter computation.
For instance:
static int create_widget(char *input_name)
{
struct snd_soc_dapm_widget widget;
char name*;
...
name = input_name;
if (!name)
name = "default";
widget = SND_SOC_DAPM_WIDGET(SND_SOC_DAPM_INPUT(name));
...
}
Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
---
include/sound/soc-dapm.h | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index 64915ebd641e..d6bb97fba8c9 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -276,7 +276,17 @@ struct soc_enum;
.reg = SND_SOC_NOPM, .event = dapm_pinctrl_event, \
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD }
-
+/*
+ * Helper to create a widget 'dynamically'
+ * This can be used with any of the SND_SOC_DAPM_* widget helper.
+ * For instance:
+ * struct snd_soc_dapm_widget widget;
+ * ...
+ * widget = SND_SOC_DAPM_WIDGET(SND_SOC_DAPM_INPUT(input_name));
+ */
+#define SND_SOC_DAPM_WIDGET(_widget)({ \
+ struct snd_soc_dapm_widget _w[1] = { _widget }; \
+ _w[0]; })
/* dapm kcontrol types */
#define SOC_DAPM_DOUBLE(xname, reg, lshift, rshift, max, invert) \
--
2.39.2
--- End Message ---