From: Christian Marangi <ansuelsmth@gmail.com>
To: Christian Marangi <ansuelsmth@gmail.com>,
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>,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
Cyril Chao <Cyril.Chao@mediatek.com>,
Darren Ye <darren.ye@mediatek.com>,
Rosen Penev <rosenp@gmail.com>,
Daniel Golle <daniel@makrotopia.org>,
bui duc phuc <phucduc.bui@gmail.com>,
linux-sound@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org
Subject: [PATCH v6 5/5] ASoC: airoha: Add machine driver for Airoha AN7581
Date: Tue, 8 Sep 2026 11:04:47 +0200 [thread overview]
Message-ID: <20260908090448.3332-6-ansuelsmth@gmail.com> (raw)
In-Reply-To: <20260908090448.3332-1-ansuelsmth@gmail.com>
Add support for the machine driver for Airoha AN7581 paired with the WM8960
i2c codec. This driver creates the sound card for the AFE driver.
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
sound/soc/mediatek/Kconfig | 10 ++
sound/soc/mediatek/an7581/Makefile | 1 +
sound/soc/mediatek/an7581/an7581-wm8960.c | 161 ++++++++++++++++++++++
3 files changed, 172 insertions(+)
create mode 100644 sound/soc/mediatek/an7581/an7581-wm8960.c
diff --git a/sound/soc/mediatek/Kconfig b/sound/soc/mediatek/Kconfig
index eb6f2a443b23..ff2869641a35 100644
--- a/sound/soc/mediatek/Kconfig
+++ b/sound/soc/mediatek/Kconfig
@@ -16,6 +16,16 @@ config SND_SOC_AN7581
Select Y if you have such device.
If unsure select "N".
+config SND_SOC_AN7581_WM8960
+ tristate "ASoc Audio driver for Airoha AN7581 with WM8960 codec"
+ depends on SND_SOC_AN7581 && I2C
+ select SND_SOC_WM8960
+ help
+ This adds support for ASoC machine driver for Airoha AN7581
+ boards with the WM8960 codecs.
+ Select Y if you have such device.
+ If unsure select "N".
+
endmenu
menu "Mediatek"
diff --git a/sound/soc/mediatek/an7581/Makefile b/sound/soc/mediatek/an7581/Makefile
index d6de5ee1668e..f48cd0269bea 100644
--- a/sound/soc/mediatek/an7581/Makefile
+++ b/sound/soc/mediatek/an7581/Makefile
@@ -6,3 +6,4 @@ snd-soc-an7581-afe-y := \
an7581-dai-etdm.o
obj-$(CONFIG_SND_SOC_AN7581) += snd-soc-an7581-afe.o
+obj-$(CONFIG_SND_SOC_AN7581_WM8960) += an7581-wm8960.o
diff --git a/sound/soc/mediatek/an7581/an7581-wm8960.c b/sound/soc/mediatek/an7581/an7581-wm8960.c
new file mode 100644
index 000000000000..03ea5732563c
--- /dev/null
+++ b/sound/soc/mediatek/an7581/an7581-wm8960.c
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Airoha ALSA SoC I2S platform driver for AN7581
+ *
+ */
+
+#include <linux/module.h>
+#include <sound/soc.h>
+
+#include "an7581-afe-common.h"
+
+SND_SOC_DAILINK_DEFS(playback,
+ DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
+ DAILINK_COMP_ARRAY(COMP_DUMMY()),
+ DAILINK_COMP_ARRAY(COMP_EMPTY(), COMP_EMPTY()));
+
+SND_SOC_DAILINK_DEFS(capture,
+ DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
+ DAILINK_COMP_ARRAY(COMP_DUMMY()),
+ DAILINK_COMP_ARRAY(COMP_EMPTY(), COMP_EMPTY()));
+
+SND_SOC_DAILINK_DEFS(codec,
+ DAILINK_COMP_ARRAY(COMP_CPU("ETDM")),
+ DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "wm8960-hifi")),
+ DAILINK_COMP_ARRAY(COMP_EMPTY(), COMP_EMPTY()));
+
+static struct snd_soc_dai_link an7581_wm8960_dai_links[] = {
+ /* FE */
+ {
+ .name = "wm8960-playback",
+ .stream_name = "wm8960-playback",
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .dynamic = 1,
+ .playback_only = 1,
+ SND_SOC_DAILINK_REG(playback),
+ },
+ {
+ .name = "wm8960-capture",
+ .stream_name = "wm8960-capture",
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .dynamic = 1,
+ .capture_only = 1,
+ SND_SOC_DAILINK_REG(capture),
+ },
+ /* BE */
+ {
+ .name = "wm8960-codec",
+ .no_pcm = 1,
+ .dai_fmt = SND_SOC_DAIFMT_I2S |
+ SND_SOC_DAIFMT_NB_NF |
+ SND_SOC_DAIFMT_CBP_CFP |
+ SND_SOC_DAIFMT_GATED,
+ SND_SOC_DAILINK_REG(codec),
+ },
+};
+
+static struct snd_soc_card an7581_wm8960_card = {
+ .name = "an7581-wm8960",
+ .owner = THIS_MODULE,
+ .dai_link = an7581_wm8960_dai_links,
+ .num_links = ARRAY_SIZE(an7581_wm8960_dai_links),
+};
+
+static int an7581_wm8960_machine_probe(struct platform_device *pdev)
+{
+ struct device_node *platform_dai_node, *codec_dai_node;
+ struct snd_soc_card *card = &an7581_wm8960_card;
+ struct device_node *of_platform, *codec;
+ struct snd_soc_dai_link *dai_link;
+ int i, d, ret;
+
+ card->dev = &pdev->dev;
+
+ of_platform = of_get_child_by_name(pdev->dev.of_node, "platform");
+
+ if (of_platform) {
+ platform_dai_node = of_parse_phandle(of_platform, "sound-dai", 0);
+ of_node_put(of_platform);
+
+ if (!platform_dai_node) {
+ dev_err(&pdev->dev, "Failed to parse platform/sound-dai property\n");
+ return -EINVAL;
+ }
+ } else {
+ dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
+ return -EINVAL;
+ }
+
+ for_each_card_prelinks(card, i, dai_link) {
+ struct snd_soc_dai_link_component *platform;
+
+ dai_link->num_platforms = 2;
+ for_each_link_platforms(dai_link, d, platform) {
+ if (platform->name)
+ continue;
+ platform->of_node = platform_dai_node;
+ }
+ }
+
+ codec = of_get_child_by_name(pdev->dev.of_node, "codec");
+
+ if (codec) {
+ codec_dai_node = of_parse_phandle(codec, "sound-dai", 0);
+ of_node_put(codec);
+
+ if (!codec_dai_node) {
+ of_node_put(platform_dai_node);
+ dev_err(&pdev->dev, "Failed to parse codec/sound-dai property\n");
+ return -EINVAL;
+ }
+ } else {
+ of_node_put(platform_dai_node);
+ dev_err(&pdev->dev, "Property 'codec' missing or invalid\n");
+ return -EINVAL;
+ }
+
+ for_each_card_prelinks(card, i, dai_link) {
+ if (dai_link->codecs->name)
+ continue;
+ dai_link->codecs->of_node = codec_dai_node;
+ }
+
+ ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
+ if (ret) {
+ dev_err(&pdev->dev, "Failed to parse audio-routing: %d\n", ret);
+ goto err_of_node_put;
+ }
+
+ ret = devm_snd_soc_register_card(&pdev->dev, card);
+ if (ret) {
+ dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
+ goto err_of_node_put;
+ }
+
+ return 0;
+
+err_of_node_put:
+ of_node_put(platform_dai_node);
+ of_node_put(codec_dai_node);
+ return ret;
+}
+
+static const struct of_device_id an7581_wm8960_machine_dt_match[] = {
+ { .compatible = "airoha,an7581-wm8960-sound" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, an7581_wm8960_machine_dt_match);
+
+static struct platform_driver an7581_wm8960_driver = {
+ .driver = {
+ .name = "an7581-wm8960",
+ .of_match_table = an7581_wm8960_machine_dt_match,
+ },
+ .probe = an7581_wm8960_machine_probe,
+};
+module_platform_driver(an7581_wm8960_driver);
+
+MODULE_DESCRIPTION("Airoha SoC I2S platform driver for ALSA AN7581");
+MODULE_LICENSE("GPL");
--
2.53.0
next prev parent reply other threads:[~2026-09-08 9:05 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 9:04 [PATCH v6 0/5] ASoC: Add support for Airoha AN7581 Christian Marangi
2026-09-08 9:04 ` [PATCH v6 1/5] ASoC: dt-bindings: Add Airoha AN7581 AFE Sound card Christian Marangi
2026-09-08 9:04 ` [PATCH v6 2/5] ASoC: dt-bindings: Add Airoha AN7581 AFE with WM8960 Codec schema Christian Marangi
2026-09-08 9:04 ` [PATCH v6 3/5] ASoC: mediatek: common: permit to provide dedicated regmap for irq Christian Marangi
2026-09-08 9:04 ` [PATCH v6 4/5] ASoC: airoha: Add AFE driver for Airoha AN7581 Christian Marangi
2026-09-08 9:17 ` sashiko-bot
2026-09-08 9:19 ` Bui Duc Phuc
2026-09-08 9:04 ` Christian Marangi [this message]
2026-09-08 9:23 ` [PATCH v6 5/5] ASoC: airoha: Add machine " sashiko-bot
2026-09-18 21:24 ` [PATCH v6 0/5] ASoC: Add support " Mark Brown
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=20260908090448.3332-6-ansuelsmth@gmail.com \
--to=ansuelsmth@gmail.com \
--cc=Cyril.Chao@mediatek.com \
--cc=angelogioacchino.delregno@collabora.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=daniel@makrotopia.org \
--cc=darren.ye@mediatek.com \
--cc=devicetree@vger.kernel.org \
--cc=krzk+dt@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-sound@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=p.zabel@pengutronix.de \
--cc=perex@perex.cz \
--cc=phucduc.bui@gmail.com \
--cc=robh@kernel.org \
--cc=rosenp@gmail.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.