ASoC: SOF: Introduce function sof_of_machine_select
authorChunxu Li <chunxu.li@mediatek.com>
Sat, 3 Sep 2022 03:21:51 +0000 (11:21 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 5 Sep 2022 12:09:40 +0000 (13:09 +0100)
From current design in sof_machine_check the SOF can only support
ACPI type machine.

In sof_machine_check if there is no ACPI machine exist, the function
will return -ENODEV directly, that's we don't expected if we do not
base on ACPI machine.

So we add a new function named sof_of_machine_select that we can pass
sof_machine_check and obtain info required by snd_sof_new_platform_drv.

Signed-off-by: Chunxu Li <chunxu.li@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20220903032151.13664-1-chunxu.li@mediatek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/sof-audio.c

index c18e723435bd1eca8b0e2ae949370a156c474267..ea9663d448eb8a8923c8ce0128d775c63087eb58 100644 (file)
@@ -785,6 +785,28 @@ int sof_dai_get_bclk(struct snd_soc_pcm_runtime *rtd)
 }
 EXPORT_SYMBOL(sof_dai_get_bclk);
 
+static struct snd_sof_of_mach *sof_of_machine_select(struct snd_sof_dev *sdev)
+{
+       struct snd_sof_pdata *sof_pdata = sdev->pdata;
+       const struct sof_dev_desc *desc = sof_pdata->desc;
+       struct snd_sof_of_mach *mach = desc->of_machines;
+
+       if (!mach)
+               return NULL;
+
+       for (; mach->compatible; mach++) {
+               if (of_machine_is_compatible(mach->compatible)) {
+                       sof_pdata->tplg_filename = mach->sof_tplg_filename;
+                       if (mach->fw_filename)
+                               sof_pdata->fw_filename = mach->fw_filename;
+
+                       return mach;
+               }
+       }
+
+       return NULL;
+}
+
 /*
  * SOF Driver enumeration.
  */
@@ -795,6 +817,7 @@ int sof_machine_check(struct snd_sof_dev *sdev)
        struct snd_soc_acpi_mach *mach;
 
        if (!IS_ENABLED(CONFIG_SND_SOC_SOF_FORCE_NOCODEC_MODE)) {
+               const struct snd_sof_of_mach *of_mach;
 
                /* find machine */
                mach = snd_sof_machine_select(sdev);
@@ -804,6 +827,12 @@ int sof_machine_check(struct snd_sof_dev *sdev)
                        return 0;
                }
 
+               of_mach = sof_of_machine_select(sdev);
+               if (of_mach) {
+                       sof_pdata->of_machine = of_mach;
+                       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;