From: Linus Walleij <linusw@kernel.org>
To: Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Lee Jones <lee@kernel.org>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>
Cc: linux-sound@vger.kernel.org, devicetree@vger.kernel.org,
mfd@lists.linux.dev, Linus Walleij <linusw@kernel.org>
Subject: [PATCH 4/9] ASoC: ab8500: Skip digital microphone support on AB8505
Date: Fri, 11 Sep 2026 01:03:47 +0200 [thread overview]
Message-ID: <20260911-ux500-simple-sound-v1-4-6771ac714e82@kernel.org> (raw)
In-Reply-To: <20260911-ux500-simple-sound-v1-0-6771ac714e82@kernel.org>
The AB8505 does not have the digital microphone interface, its six
input pins or the VDMIC regulator found in AB8500. The shared codec
driver nevertheless creates the entire AB8500 DMIC DAPM graph. When an
AB8505 sound card binds, the regulator widget requests the nonexistent
V-DMIC supply and falls back to a dummy regulator.
Split the digital microphone widgets and routes from the common codec
graph and add them only when the parent MFD is an actual AB8500. This
also removes the DMIC4-only AD_OUT4 path from AB8505.
Fixes: 679d7abdc754 ("ASoC: codecs: Add AB8500 codec-driver")
Assisted-by: LLM
Signed-off-by: Linus Walleij <linusw@kernel.org>
---
sound/soc/codecs/ab8500-codec.c | 144 +++++++++++++++++++++++-----------------
1 file changed, 82 insertions(+), 62 deletions(-)
diff --git a/sound/soc/codecs/ab8500-codec.c b/sound/soc/codecs/ab8500-codec.c
index e1a0e35836e6..35df09705440 100644
--- a/sound/soc/codecs/ab8500-codec.c
+++ b/sound/soc/codecs/ab8500-codec.c
@@ -299,7 +299,6 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
- SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
/* Power */
SND_SOC_DAPM_SUPPLY("Audio Power",
@@ -324,7 +323,6 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_AIF_OUT("AD_OUT1", NULL, 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT2", NULL, 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT3", NULL, 0, SND_SOC_NOPM, 0, 0),
- SND_SOC_DAPM_AIF_OUT("AD_OUT4", NULL, 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT57", NULL, 0, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_OUT("AD_OUT68", NULL, 0, SND_SOC_NOPM, 0, 0),
@@ -584,36 +582,6 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
SND_SOC_DAPM_SUPPLY("AD5768 Enable", AB8500_ADPATHENA,
AB8500_ADPATHENA_ENAD5768, 0, NULL, 0),
- /* Digital Microphone path */
-
- SND_SOC_DAPM_INPUT("DMic 1"),
- SND_SOC_DAPM_INPUT("DMic 2"),
- SND_SOC_DAPM_INPUT("DMic 3"),
- SND_SOC_DAPM_INPUT("DMic 4"),
- SND_SOC_DAPM_INPUT("DMic 5"),
- SND_SOC_DAPM_INPUT("DMic 6"),
-
- SND_SOC_DAPM_MIXER("DMIC1",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC1, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("DMIC2",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC2, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("DMIC3",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC3, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("DMIC4",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC4, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("DMIC5",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC5, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("DMIC6",
- AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC6, 0,
- NULL, 0),
- SND_SOC_DAPM_MIXER("AD4 Channel Volume",
- SND_SOC_NOPM, 0, 0,
- NULL, 0),
/* Acoustical Noise Cancellation path */
SND_SOC_DAPM_MUX("ANC Source",
@@ -648,6 +616,40 @@ static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
NULL, 0),
};
+static const struct snd_soc_dapm_widget ab8500_dmic_dapm_widgets[] = {
+ SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
+ SND_SOC_DAPM_AIF_OUT("AD_OUT4", NULL, 0, SND_SOC_NOPM, 0, 0),
+
+ SND_SOC_DAPM_INPUT("DMic 1"),
+ SND_SOC_DAPM_INPUT("DMic 2"),
+ SND_SOC_DAPM_INPUT("DMic 3"),
+ SND_SOC_DAPM_INPUT("DMic 4"),
+ SND_SOC_DAPM_INPUT("DMic 5"),
+ SND_SOC_DAPM_INPUT("DMic 6"),
+
+ SND_SOC_DAPM_MIXER("DMIC1",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC1, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("DMIC2",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC2, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("DMIC3",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC3, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("DMIC4",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC4, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("DMIC5",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC5, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("DMIC6",
+ AB8500_DIGMICCONF, AB8500_DIGMICCONF_ENDMIC6, 0,
+ NULL, 0),
+ SND_SOC_DAPM_MIXER("AD4 Channel Volume",
+ SND_SOC_NOPM, 0, 0,
+ NULL, 0),
+};
+
/*
* DAPM-routes
*/
@@ -853,35 +855,6 @@ static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
{"AD_OUT68", NULL, "Main Supply"},
{"AD_OUT68", NULL, "AD6 Channel Volume"},
- /* Digital Microphone path */
-
- {"DMic 1", NULL, "V-DMIC"},
- {"DMic 2", NULL, "V-DMIC"},
- {"DMic 3", NULL, "V-DMIC"},
- {"DMic 4", NULL, "V-DMIC"},
- {"DMic 5", NULL, "V-DMIC"},
- {"DMic 6", NULL, "V-DMIC"},
-
- {"DMIC1", NULL, "DMic 1"},
- {"DMIC2", NULL, "DMic 2"},
- {"DMIC3", NULL, "DMic 3"},
- {"DMIC4", NULL, "DMic 4"},
- {"DMIC5", NULL, "DMic 5"},
- {"DMIC6", NULL, "DMic 6"},
-
- {"AD1 Source Select", "DMic 1", "DMIC1"},
- {"AD2 Source Select", "DMic 2", "DMIC2"},
- {"AD3 Source Select", "DMic 3", "DMIC3"},
- {"AD5 Source Select", "DMic 5", "DMIC5"},
- {"AD6 Source Select", "DMic 6", "DMIC6"},
-
- {"AD4 Channel Volume", NULL, "DMIC4"},
- {"AD4 Channel Volume", NULL, "AD34 Enable"},
-
- {"ab8500_0c", NULL, "AD_OUT4"},
- {"AD_OUT4", NULL, "Main Supply"},
- {"AD_OUT4", NULL, "AD4 Channel Volume"},
-
/* LineIn Bypass path */
{"LINL to HSL Volume", NULL, "LINL Enable"},
@@ -911,7 +884,6 @@ static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
{"Sidetone Left Source", "Headset Left", "DA_IN1"},
{"Sidetone Right Source", "LineIn Right", "AD2 Channel Volume"},
{"Sidetone Right Source", "Mic 1", "AD3 Channel Volume"},
- {"Sidetone Right Source", "DMic 4", "AD4 Channel Volume"},
{"Sidetone Right Source", "Headset Right", "DA_IN2"},
{"STFIR1 Control", NULL, "Sidetone Left Source"},
@@ -924,6 +896,37 @@ static const struct snd_soc_dapm_route ab8500_dapm_routes[] = {
{"DA2 Enable", NULL, "STFIR2 Volume"},
};
+static const struct snd_soc_dapm_route ab8500_dmic_dapm_routes[] = {
+ {"DMic 1", NULL, "V-DMIC"},
+ {"DMic 2", NULL, "V-DMIC"},
+ {"DMic 3", NULL, "V-DMIC"},
+ {"DMic 4", NULL, "V-DMIC"},
+ {"DMic 5", NULL, "V-DMIC"},
+ {"DMic 6", NULL, "V-DMIC"},
+
+ {"DMIC1", NULL, "DMic 1"},
+ {"DMIC2", NULL, "DMic 2"},
+ {"DMIC3", NULL, "DMic 3"},
+ {"DMIC4", NULL, "DMic 4"},
+ {"DMIC5", NULL, "DMic 5"},
+ {"DMIC6", NULL, "DMic 6"},
+
+ {"AD1 Source Select", "DMic 1", "DMIC1"},
+ {"AD2 Source Select", "DMic 2", "DMIC2"},
+ {"AD3 Source Select", "DMic 3", "DMIC3"},
+ {"AD5 Source Select", "DMic 5", "DMIC5"},
+ {"AD6 Source Select", "DMic 6", "DMIC6"},
+
+ {"AD4 Channel Volume", NULL, "DMIC4"},
+ {"AD4 Channel Volume", NULL, "AD34 Enable"},
+
+ {"ab8500_0c", NULL, "AD_OUT4"},
+ {"AD_OUT4", NULL, "Main Supply"},
+ {"AD_OUT4", NULL, "AD4 Channel Volume"},
+
+ {"Sidetone Right Source", "DMic 4", "AD4 Channel Volume"},
+};
+
static const struct snd_soc_dapm_route ab8500_dapm_routes_mic1a_vamicx[] = {
{"MIC1A V-AMICx Enable", NULL, "V-AMIC1"},
{"MIC1A V-AMICx Enable", NULL, "V-AMIC2"},
@@ -2043,13 +2046,30 @@ static int ab8500_codec_probe(struct snd_soc_component *component)
{
struct device *dev = component->dev;
struct device_node *np = dev->of_node;
+ struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
struct ab8500_codec_platform_data codec_pdata;
+ struct snd_soc_dapm_context *dapm;
int status;
dev_dbg(dev, "%s: Enter.\n", __func__);
ab8500_codec_of_probe(dev, np, &codec_pdata);
+ if (is_ab8500(ab8500)) {
+ dapm = snd_soc_component_to_dapm(component);
+ status = snd_soc_dapm_new_controls(dapm,
+ ab8500_dmic_dapm_widgets,
+ ARRAY_SIZE(ab8500_dmic_dapm_widgets));
+ if (status)
+ return status;
+
+ status = snd_soc_dapm_add_routes(dapm,
+ ab8500_dmic_dapm_routes,
+ ARRAY_SIZE(ab8500_dmic_dapm_routes));
+ if (status)
+ return status;
+ }
+
status = ab8500_audio_init_audioblock(component);
if (status < 0) {
dev_err(dev, "%s: failed to init audio-block (%d)!\n",
--
2.55.0
next prev parent reply other threads:[~2026-09-10 23:04 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 23:03 [PATCH 0/9] ASoC: ux500: Migrate HREF and Samsung audio to simple-card Linus Walleij
2026-09-10 23:03 ` [PATCH 1/9] ASoC: dt-bindings: ux500: Convert MSP binding to DT schema Linus Walleij
2026-09-10 23:10 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 2/9] mfd: dt-bindings: ab8500: Describe codec DAI and microphone wiring Linus Walleij
2026-09-10 23:08 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 3/9] ASoC: dt-bindings: ux500: Remove MOP500 sound card binding Linus Walleij
2026-09-10 23:07 ` sashiko-bot
2026-09-10 23:03 ` Linus Walleij [this message]
2026-09-10 23:17 ` [PATCH 4/9] ASoC: ab8500: Skip digital microphone support on AB8505 sashiko-bot
2026-09-10 23:03 ` [PATCH 5/9] ARM: dts: ux500: Add sound DAI provider cells Linus Walleij
2026-09-10 23:08 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 6/9] ARM: dts: ux500: Convert HREF audio card to simple-card Linus Walleij
2026-09-10 23:14 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 7/9] ARM: dts: ux500: Add Samsung phone sound cards Linus Walleij
2026-09-10 23:15 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 8/9] ASoC: ux500: Remove the MOP500 machine driver Linus Walleij
2026-09-10 23:14 ` sashiko-bot
2026-09-10 23:03 ` [PATCH 9/9] ARM: config: u8500: Enable the simple audio card Linus Walleij
2026-09-10 23:09 ` sashiko-bot
2026-09-10 23:10 ` [PATCH 0/9] ASoC: ux500: Migrate HREF and Samsung audio to simple-card Mark Brown
2026-09-11 8:36 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260911-ux500-simple-sound-v1-4-6771ac714e82@kernel.org \
--to=linusw@kernel.org \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=lee@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=mfd@lists.linux.dev \
--cc=perex@perex.cz \
--cc=robh@kernel.org \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox