ASOC: SOF: simplify nocodec mode
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 9 Apr 2021 22:01:21 +0000 (15:01 -0700)
committerMark Brown <broonie@kernel.org>
Mon, 12 Apr 2021 16:05:55 +0000 (17:05 +0100)
Replace ugly #if (!IS_ENABLED) by if (!IS_ENABLED), remove
cross-module dependencies and use classic mechanism to pass
information to the machine driver.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Daniel Baluta <daniel.baluta@gmail.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20210409220121.1542362-7-ranjani.sridharan@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/sof.h
sound/soc/sof/nocodec.c
sound/soc/sof/sof-audio.c

index b93bb80..502ed9b 100644 (file)
@@ -100,9 +100,6 @@ struct sof_dev_desc {
        const struct snd_sof_dsp_ops *ops;
 };
 
-int sof_nocodec_setup(struct device *dev, const struct snd_sof_dsp_ops *ops,
-                     int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd,
-                                               struct snd_pcm_hw_params *params));
 int sof_dai_get_mclk(struct snd_soc_pcm_runtime *rtd);
 
 #endif
index 3b9bb2e..356497f 100644 (file)
@@ -20,16 +20,14 @@ static struct snd_soc_card sof_nocodec_card = {
 };
 
 static int sof_nocodec_bes_setup(struct device *dev,
-                                const struct snd_sof_dsp_ops *ops,
+                                struct snd_soc_dai_driver *drv,
                                 struct snd_soc_dai_link *links,
-                                int link_num, struct snd_soc_card *card,
-                                int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd,
-                                                          struct snd_pcm_hw_params *params))
+                                int link_num, struct snd_soc_card *card)
 {
        struct snd_soc_dai_link_component *dlc;
        int i;
 
-       if (!ops || !links || !card)
+       if (!drv || !links || !card)
                return -EINVAL;
 
        /* set up BE dai_links */
@@ -55,16 +53,16 @@ static int sof_nocodec_bes_setup(struct device *dev,
 
                links[i].id = i;
                links[i].no_pcm = 1;
-               links[i].cpus->dai_name = ops->drv[i].name;
-               links[i].platforms->name = dev_name(dev);
+               links[i].cpus->dai_name = drv[i].name;
+               links[i].platforms->name = dev_name(dev->parent);
                links[i].codecs->dai_name = "snd-soc-dummy-dai";
                links[i].codecs->name = "snd-soc-dummy";
-               if (ops->drv[i].playback.channels_min)
+               if (drv[i].playback.channels_min)
                        links[i].dpcm_playback = 1;
-               if (ops->drv[i].capture.channels_min)
+               if (drv[i].capture.channels_min)
                        links[i].dpcm_capture = 1;
 
-               links[i].be_hw_params_fixup = pcm_dai_link_fixup;
+               links[i].be_hw_params_fixup = sof_pcm_dai_link_fixup;
        }
 
        card->dai_link = links;
@@ -73,29 +71,34 @@ static int sof_nocodec_bes_setup(struct device *dev,
        return 0;
 }
 
-int sof_nocodec_setup(struct device *dev, const struct snd_sof_dsp_ops *ops,
-                     int (*pcm_dai_link_fixup)(struct snd_soc_pcm_runtime *rtd,
-                                               struct snd_pcm_hw_params *params))
+static int sof_nocodec_setup(struct device *dev,
+                            u32 num_dai_drivers,
+                            struct snd_soc_dai_driver *dai_drivers)
 {
        struct snd_soc_dai_link *links;
 
        /* create dummy BE dai_links */
-       links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) *
-                            ops->num_drv, GFP_KERNEL);
+       links = devm_kzalloc(dev, sizeof(struct snd_soc_dai_link) * num_dai_drivers, GFP_KERNEL);
        if (!links)
                return -ENOMEM;
 
-       return sof_nocodec_bes_setup(dev, ops, links, ops->num_drv,
-                                    &sof_nocodec_card, pcm_dai_link_fixup);
+       return sof_nocodec_bes_setup(dev, dai_drivers, links, num_dai_drivers, &sof_nocodec_card);
 }
-EXPORT_SYMBOL(sof_nocodec_setup);
 
 static int sof_nocodec_probe(struct platform_device *pdev)
 {
        struct snd_soc_card *card = &sof_nocodec_card;
+       struct snd_soc_acpi_mach *mach;
+       int ret;
 
        card->dev = &pdev->dev;
        card->topology_shortname_created = true;
+       mach = pdev->dev.platform_data;
+
+       ret = sof_nocodec_setup(card->dev, mach->mach_params.num_dai_drivers,
+                               mach->mach_params.dai_drivers);
+       if (ret < 0)
+               return ret;
 
        return devm_snd_soc_register_card(&pdev->dev, card);
 }
index 5d13baf..0d0d47d 100644 (file)
@@ -468,24 +468,24 @@ int sof_machine_check(struct snd_sof_dev *sdev)
        struct snd_sof_pdata *sof_pdata = sdev->pdata;
        const struct sof_dev_desc *desc = sof_pdata->desc;
        struct snd_soc_acpi_mach *mach;
-       int ret;
 
-#if !IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)
+       if (!IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)) {
 
-       /* find machine */
-       snd_sof_machine_select(sdev);
-       if (sof_pdata->machine) {
-               snd_sof_set_mach_params(sof_pdata->machine, sdev);
-               return 0;
+               /* find machine */
+               snd_sof_machine_select(sdev);
+               if (sof_pdata->machine) {
+                       snd_sof_set_mach_params(sof_pdata->machine, sdev);
+                       return 0;
+               }
+
+               if (!IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)) {
+                       dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n");
+                       return -ENODEV;
+               }
+       } else {
+               dev_warn(sdev->dev, "Force to use nocodec mode\n");
        }
 
-#if !IS_ENABLED(CONFIG_SND_SOC_SOF_NOCODEC)
-       dev_err(sdev->dev, "error: no matching ASoC machine driver found - aborting probe\n");
-       return -ENODEV;
-#endif
-#else
-       dev_warn(sdev->dev, "Force to use nocodec mode\n");
-#endif
        /* select nocodec mode */
        dev_warn(sdev->dev, "Using nocodec machine driver\n");
        mach = devm_kzalloc(sdev->dev, sizeof(*mach), GFP_KERNEL);
@@ -495,10 +495,6 @@ int sof_machine_check(struct snd_sof_dev *sdev)
        mach->drv_name = "sof-nocodec";
        sof_pdata->tplg_filename = desc->nocodec_tplg_filename;
 
-       ret = sof_nocodec_setup(sdev->dev, desc->ops, sof_pcm_dai_link_fixup);
-       if (ret < 0)
-               return ret;
-
        sof_pdata->machine = mach;
        snd_sof_set_mach_params(sof_pdata->machine, sdev);