OSDN Git Service

ASoC: Intel: avs: Provide support for fallback topology
authorAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Tue, 5 Sep 2023 09:31:47 +0000 (11:31 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 5 Sep 2023 16:28:07 +0000 (17:28 +0100)
HDA and HDMI devices are simple enough that in case of user not having
topology tailored to their device, they can use fallback topology.

Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Link: https://lore.kernel.org/r/20230905093147.1960675-1-amadeuszx.slawinski@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/avs/pcm.c

index 1fbb2c2..8565a53 100644 (file)
@@ -796,6 +796,28 @@ static int avs_component_probe(struct snd_soc_component *component)
 
        ret = avs_load_topology(component, filename);
        kfree(filename);
+       if (ret == -ENOENT && !strncmp(mach->tplg_filename, "hda-", 4)) {
+               unsigned int vendor_id;
+
+               if (sscanf(mach->tplg_filename, "hda-%08x-tplg.bin", &vendor_id) != 1)
+                       return ret;
+
+               if (((vendor_id >> 16) & 0xFFFF) == 0x8086)
+                       mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
+                                                            "hda-8086-generic-tplg.bin");
+               else
+                       mach->tplg_filename = devm_kasprintf(adev->dev, GFP_KERNEL,
+                                                            "hda-generic-tplg.bin");
+
+               filename = kasprintf(GFP_KERNEL, "%s/%s", component->driver->topology_name_prefix,
+                                    mach->tplg_filename);
+               if (!filename)
+                       return -ENOMEM;
+
+               dev_info(card->dev, "trying to load fallback topology %s\n", mach->tplg_filename);
+               ret = avs_load_topology(component, filename);
+               kfree(filename);
+       }
        if (ret < 0)
                return ret;