]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: Intel: avs: dmic: Refactor dai_link creation
authorCezary Rojewski <cezary.rojewski@intel.com>
Tue, 2 Sep 2025 09:48:39 +0000 (11:48 +0200)
committerMark Brown <broonie@kernel.org>
Wed, 3 Sep 2025 11:34:00 +0000 (12:34 +0100)
To allow for multiple instances of the card, move away from static
dai_link declaration.

While at it, simplify the code as the name of the platform component
matches the name of the card's platform_device:
- drop mach->mach_params.platform usage
- drop snd_soc_fixup_dai_links_platform_name() usage

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Message-ID: <20250902094853.1231842-4-cezary.rojewski@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/avs/boards/dmic.c

index a1448a98874d48f0931263fb4316e3f2c76fe459..bf6f580a51643c8b11328f657594de10a3e2a8a6 100644 (file)
 
 SND_SOC_DAILINK_DEF(dmic_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin")));
 SND_SOC_DAILINK_DEF(dmic_wov_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC WoV Pin")));
-SND_SOC_DAILINK_DEF(dmic_codec, DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
-/* Name overridden on probe */
-SND_SOC_DAILINK_DEF(platform, DAILINK_COMP_ARRAY(COMP_PLATFORM("")));
-
-static struct snd_soc_dai_link card_dai_links[] = {
-       /* Back ends */
-       {
-               .name = "DMIC",
-               .id = 0,
-               .capture_only = 1,
-               .nonatomic = 1,
-               .no_pcm = 1,
-               SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
-       },
-       {
-               .name = "DMIC WoV",
-               .id = 1,
-               .capture_only = 1,
-               .nonatomic = 1,
-               .no_pcm = 1,
-               .ignore_suspend = 1,
-               SND_SOC_DAILINK_REG(dmic_wov_pin, dmic_codec, platform),
-       },
-};
 
 static const struct snd_soc_dapm_widget card_widgets[] = {
        SND_SOC_DAPM_MIC("SoC DMIC", NULL),
@@ -47,12 +23,56 @@ static const struct snd_soc_dapm_route card_routes[] = {
        {"DMic", NULL, "SoC DMIC"},
 };
 
+static int avs_create_dai_links(struct device *dev, const char *codec_name,
+                               struct snd_soc_dai_link **links, int *num_links)
+{
+       struct snd_soc_dai_link_component *platform;
+       struct snd_soc_dai_link *dl;
+       const int num_dl = 2;
+
+       dl = devm_kcalloc(dev, num_dl, sizeof(*dl), GFP_KERNEL);
+       platform = devm_kzalloc(dev, sizeof(*platform), GFP_KERNEL);
+       if (!dl || !platform)
+               return -ENOMEM;
+
+       dl->codecs = devm_kzalloc(dev, sizeof(*dl->codecs), GFP_KERNEL);
+       if (!dl->codecs)
+               return -ENOMEM;
+
+       dl->codecs->name = devm_kstrdup(dev, codec_name, GFP_KERNEL);
+       dl->codecs->dai_name = devm_kasprintf(dev, GFP_KERNEL, "dmic-hifi");
+       if (!dl->codecs->name || !dl->codecs->dai_name)
+               return -ENOMEM;
+
+       platform->name = dev_name(dev);
+       dl[0].num_cpus = 1;
+       dl[0].num_codecs = 1;
+       dl[0].platforms = platform;
+       dl[0].num_platforms = 1;
+       dl[0].nonatomic = 1;
+       dl[0].no_pcm = 1;
+       dl[0].capture_only = 1;
+       memcpy(&dl[1], &dl[0], sizeof(*dl));
+
+       dl[0].name = "DMIC";
+       dl[0].cpus = dmic_pin;
+       dl[0].id = 0;
+       dl[1].name = "DMIC WoV";
+       dl[1].cpus = dmic_wov_pin;
+       dl[1].id = 1;
+       dl[1].ignore_suspend = 1;
+
+       *links = dl;
+       *num_links = num_dl;
+       return 0;
+}
+
 static int avs_dmic_probe(struct platform_device *pdev)
 {
+       struct device *dev = &pdev->dev;
        struct snd_soc_acpi_mach *mach;
        struct avs_mach_pdata *pdata;
        struct snd_soc_card *card;
-       struct device *dev = &pdev->dev;
        int ret;
 
        mach = dev_get_platdata(dev);
@@ -62,6 +82,10 @@ static int avs_dmic_probe(struct platform_device *pdev)
        if (!card)
                return -ENOMEM;
 
+       ret = avs_create_dai_links(dev, pdata->codec_name, &card->dai_link, &card->num_links);
+       if (ret)
+               return ret;
+
        if (pdata->obsolete_card_names) {
                card->name = "avs_dmic";
        } else {
@@ -70,18 +94,12 @@ static int avs_dmic_probe(struct platform_device *pdev)
        }
        card->dev = dev;
        card->owner = THIS_MODULE;
-       card->dai_link = card_dai_links;
-       card->num_links = ARRAY_SIZE(card_dai_links);
        card->dapm_widgets = card_widgets;
        card->num_dapm_widgets = ARRAY_SIZE(card_widgets);
        card->dapm_routes = card_routes;
        card->num_dapm_routes = ARRAY_SIZE(card_routes);
        card->fully_routed = true;
 
-       ret = snd_soc_fixup_dai_links_platform_name(card, mach->mach_params.platform);
-       if (ret)
-               return ret;
-
        return devm_snd_soc_register_deferrable_card(dev, card);
 }