From: Sathyanarayana Nujella <sathyanarayana.nuje...@intel.com>

[ Upstream commit 5253a73d567dcd75e62834ff5f502ea9470e5722 ]

Add topology filename override based on system DMI data matching,
typically to account for a different hardware layout.

In ACPI based systems, the tplg_filename is pre-defined in an ACPI
machine table. When a DMI quirk is detected, the
sof_pdata->tplg_filename is not set with the hard-coded ACPI value,
and instead is set with the DMI-specific filename.

Reviewed-by: Guennadi Liakhovetski <guennadi.liakhovet...@linux.intel.com>
Signed-off-by: Sathyanarayana Nujella <sathyanarayana.nuje...@intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.boss...@linux.intel.com>
Link: 
https://lore.kernel.org/r/20200821195603.215535-14-pierre-louis.boss...@linux.intel.com
Signed-off-by: Mark Brown <broo...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 sound/soc/sof/intel/hda.c   |  8 +++++++-
 sound/soc/sof/sof-pci-dev.c | 24 ++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index 63ca920c8e6e0..7152e6d1cf673 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -1179,7 +1179,13 @@ void hda_machine_select(struct snd_sof_dev *sdev)
 
        mach = snd_soc_acpi_find_machine(desc->machines);
        if (mach) {
-               sof_pdata->tplg_filename = mach->sof_tplg_filename;
+               /*
+                * If tplg file name is overridden, use it instead of
+                * the one set in mach table
+                */
+               if (!sof_pdata->tplg_filename)
+                       sof_pdata->tplg_filename = mach->sof_tplg_filename;
+
                sof_pdata->machine = mach;
 
                if (mach->link_mask) {
diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c
index aa3532ba14349..f3a8140773db5 100644
--- a/sound/soc/sof/sof-pci-dev.c
+++ b/sound/soc/sof/sof-pci-dev.c
@@ -35,8 +35,28 @@ static int sof_pci_debug;
 module_param_named(sof_pci_debug, sof_pci_debug, int, 0444);
 MODULE_PARM_DESC(sof_pci_debug, "SOF PCI debug options (0x0 all off)");
 
+static const char *sof_override_tplg_name;
+
 #define SOF_PCI_DISABLE_PM_RUNTIME BIT(0)
 
+static int sof_tplg_cb(const struct dmi_system_id *id)
+{
+       sof_override_tplg_name = id->driver_data;
+       return 1;
+}
+
+static const struct dmi_system_id sof_tplg_table[] = {
+       {
+               .callback = sof_tplg_cb,
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_FAMILY, "Google_Volteer"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Terrador"),
+               },
+               .driver_data = "sof-tgl-rt5682-ssp0-max98373-ssp2.tplg",
+       },
+       {}
+};
+
 static const struct dmi_system_id community_key_platforms[] = {
        {
                .ident = "Up Squared",
@@ -347,6 +367,10 @@ static int sof_pci_probe(struct pci_dev *pci,
                sof_pdata->tplg_filename_prefix =
                        sof_pdata->desc->default_tplg_path;
 
+       dmi_check_system(sof_tplg_table);
+       if (sof_override_tplg_name)
+               sof_pdata->tplg_filename = sof_override_tplg_name;
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
        /* set callback to enable runtime_pm */
        sof_pdata->sof_probe_complete = sof_pci_probe_complete;
-- 
2.25.1

Reply via email to