mirror of
https://abf.rosa.ru/djam/kernel-5.15.git
synced 2025-02-23 18:42:55 +00:00
248 lines
9.3 KiB
Diff
248 lines
9.3 KiB
Diff
![]() |
From f9ff5f932126612549617d8eef3e657b2140ee1f Mon Sep 17 00:00:00 2001
|
||
|
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||
|
Date: Tue, 8 Mar 2022 13:25:56 -0600
|
||
|
Subject: [PATCH 427/429] ASoC: Intel: soc-acpi: quirk topology filename
|
||
|
dynamically
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Different topology filenames may be required depending on which SSP is
|
||
|
used, and whether or not digital mics are present.
|
||
|
|
||
|
This patch adds a tplg_quirk_mask and in the case of the SOF driver
|
||
|
adds the relevant configurations.
|
||
|
|
||
|
This is a short-term solution to the ES8336 support issues.
|
||
|
|
||
|
In a long-term solution, we would need an interface where the machine
|
||
|
driver or platform driver have the ability to alter the topology
|
||
|
hard-coded low-level hardware support, e.g. by substituting an
|
||
|
interface for another, or disabling an interface that is not supported
|
||
|
on a given skew.
|
||
|
|
||
|
BugLink: https://github.com/thesofproject/linux/issues/3248
|
||
|
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
|
||
|
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
|
||
|
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
|
||
|
Link: https://lore.kernel.org/r/20220308192610.392950-7-pierre-louis.bossart@linux.intel.com
|
||
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||
|
---
|
||
|
include/sound/soc-acpi.h | 20 +++++++
|
||
|
.../intel/common/soc-acpi-intel-bxt-match.c | 5 +-
|
||
|
.../intel/common/soc-acpi-intel-cml-match.c | 5 +-
|
||
|
.../intel/common/soc-acpi-intel-glk-match.c | 5 +-
|
||
|
.../intel/common/soc-acpi-intel-jsl-match.c | 5 +-
|
||
|
.../intel/common/soc-acpi-intel-tgl-match.c | 5 +-
|
||
|
sound/soc/sof/intel/hda.c | 52 +++++++++++++++++++
|
||
|
7 files changed, 92 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/include/sound/soc-acpi.h b/include/sound/soc-acpi.h
|
||
|
index 2f3fa385c..3313e2e21 100644
|
||
|
--- a/include/sound/soc-acpi.h
|
||
|
+++ b/include/sound/soc-acpi.h
|
||
|
@@ -122,6 +122,24 @@ struct snd_soc_acpi_link_adr {
|
||
|
const struct snd_soc_acpi_adr_device *adr_d;
|
||
|
};
|
||
|
|
||
|
+/*
|
||
|
+ * when set the topology uses the -ssp<N> suffix, where N is determined based on
|
||
|
+ * BIOS or DMI information
|
||
|
+ */
|
||
|
+#define SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER BIT(0)
|
||
|
+
|
||
|
+/*
|
||
|
+ * when more than one SSP is reported in the link mask, use the most significant.
|
||
|
+ * This choice was found to be valid on platforms with ES8336 codecs.
|
||
|
+ */
|
||
|
+#define SND_SOC_ACPI_TPLG_INTEL_SSP_MSB BIT(1)
|
||
|
+
|
||
|
+/*
|
||
|
+ * when set the topology uses the -dmic<N>ch suffix, where N is determined based on
|
||
|
+ * BIOS or DMI information
|
||
|
+ */
|
||
|
+#define SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER BIT(2)
|
||
|
+
|
||
|
/**
|
||
|
* snd_soc_acpi_mach: ACPI-based machine descriptor. Most of the fields are
|
||
|
* related to the hardware, except for the firmware and topology file names.
|
||
|
@@ -142,6 +160,7 @@ struct snd_soc_acpi_link_adr {
|
||
|
* is not constant since this field may be updated at run-time
|
||
|
* @sof_fw_filename: Sound Open Firmware file name, if enabled
|
||
|
* @sof_tplg_filename: Sound Open Firmware topology file name, if enabled
|
||
|
+ * @tplg_quirk_mask: quirks to select different topology files dynamically
|
||
|
*/
|
||
|
/* Descriptor for SST ASoC machine driver */
|
||
|
struct snd_soc_acpi_mach {
|
||
|
@@ -157,6 +176,7 @@ struct snd_soc_acpi_mach {
|
||
|
struct snd_soc_acpi_mach_params mach_params;
|
||
|
const char *sof_fw_filename;
|
||
|
const char *sof_tplg_filename;
|
||
|
+ const u32 tplg_quirk_mask;
|
||
|
};
|
||
|
|
||
|
#define SND_SOC_ACPI_MAX_CODECS 3
|
||
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-bxt-match.c b/sound/soc/intel/common/soc-acpi-intel-bxt-match.c
|
||
|
index 78cfdc48a..676ea2d15 100644
|
||
|
--- a/sound/soc/intel/common/soc-acpi-intel-bxt-match.c
|
||
|
+++ b/sound/soc/intel/common/soc-acpi-intel-bxt-match.c
|
||
|
@@ -86,7 +86,10 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_bxt_machines[] = {
|
||
|
.id = "ESSX8336",
|
||
|
.drv_name = "sof-essx8336",
|
||
|
.sof_fw_filename = "sof-apl.ri",
|
||
|
- .sof_tplg_filename = "sof-apl-es8336.tplg",
|
||
|
+ .sof_tplg_filename = "sof-apl-es8336", /* the tplg suffix is added at run time */
|
||
|
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-cml-match.c b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
||
|
index f03fcc080..45f3ca3d5 100644
|
||
|
--- a/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
||
|
+++ b/sound/soc/intel/common/soc-acpi-intel-cml-match.c
|
||
|
@@ -85,7 +85,10 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_cml_machines[] = {
|
||
|
.id = "ESSX8336",
|
||
|
.drv_name = "sof-essx8336",
|
||
|
.sof_fw_filename = "sof-cml.ri",
|
||
|
- .sof_tplg_filename = "sof-cml-es8336.tplg",
|
||
|
+ .sof_tplg_filename = "sof-cml-es8336", /* the tplg suffix is added at run time */
|
||
|
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-glk-match.c b/sound/soc/intel/common/soc-acpi-intel-glk-match.c
|
||
|
index 32fff9389..62e2d4847 100644
|
||
|
--- a/sound/soc/intel/common/soc-acpi-intel-glk-match.c
|
||
|
+++ b/sound/soc/intel/common/soc-acpi-intel-glk-match.c
|
||
|
@@ -53,7 +53,10 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_glk_machines[] = {
|
||
|
.id = "ESSX8336",
|
||
|
.drv_name = "sof-essx8336",
|
||
|
.sof_fw_filename = "sof-glk.ri",
|
||
|
- .sof_tplg_filename = "sof-glk-es8336.tplg",
|
||
|
+ .sof_tplg_filename = "sof-glk-es8336", /* the tplg suffix is added at run time */
|
||
|
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-jsl-match.c b/sound/soc/intel/common/soc-acpi-intel-jsl-match.c
|
||
|
index 87923bcf9..3e02203ed 100644
|
||
|
--- a/sound/soc/intel/common/soc-acpi-intel-jsl-match.c
|
||
|
+++ b/sound/soc/intel/common/soc-acpi-intel-jsl-match.c
|
||
|
@@ -85,7 +85,10 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_jsl_machines[] = {
|
||
|
.id = "ESSX8336",
|
||
|
.drv_name = "sof-essx8336",
|
||
|
.sof_fw_filename = "sof-jsl.ri",
|
||
|
- .sof_tplg_filename = "sof-jsl-es8336.tplg",
|
||
|
+ .sof_tplg_filename = "sof-jsl-es8336", /* the tplg suffix is added at run time */
|
||
|
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
diff --git a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
|
||
|
index 5f20e9d42..03c83c9b4 100644
|
||
|
--- a/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
|
||
|
+++ b/sound/soc/intel/common/soc-acpi-intel-tgl-match.c
|
||
|
@@ -387,7 +387,10 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_tgl_machines[] = {
|
||
|
.id = "ESSX8336",
|
||
|
.drv_name = "sof-essx8336",
|
||
|
.sof_fw_filename = "sof-tgl.ri",
|
||
|
- .sof_tplg_filename = "sof-tgl-es8336.tplg",
|
||
|
+ .sof_tplg_filename = "sof-tgl-es8336", /* the tplg suffix is added at run time */
|
||
|
+ .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
|
||
|
+ SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
|
||
|
},
|
||
|
{},
|
||
|
};
|
||
|
diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
|
||
|
index 0606ab264..c2062d4d8 100644
|
||
|
--- a/sound/soc/sof/intel/hda.c
|
||
|
+++ b/sound/soc/sof/intel/hda.c
|
||
|
@@ -1290,9 +1290,12 @@ void hda_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_soc_acpi_mach *mach;
|
||
|
+ const char *tplg_filename;
|
||
|
|
||
|
mach = snd_soc_acpi_find_machine(desc->machines);
|
||
|
if (mach) {
|
||
|
+ bool add_extension = false;
|
||
|
+
|
||
|
/*
|
||
|
* If tplg file name is overridden, use it instead of
|
||
|
* the one set in mach table
|
||
|
@@ -1302,6 +1305,21 @@ void hda_machine_select(struct snd_sof_dev *sdev)
|
||
|
|
||
|
sof_pdata->machine = mach;
|
||
|
|
||
|
+ if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER &&
|
||
|
+ mach->mach_params.dmic_num) {
|
||
|
+ tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
|
||
|
+ "%s%s%d%s",
|
||
|
+ sof_pdata->tplg_filename,
|
||
|
+ "-dmic",
|
||
|
+ mach->mach_params.dmic_num,
|
||
|
+ "ch");
|
||
|
+ if (!tplg_filename)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ sof_pdata->tplg_filename = tplg_filename;
|
||
|
+ add_extension = true;
|
||
|
+ }
|
||
|
+
|
||
|
if (mach->link_mask) {
|
||
|
mach->mach_params.links = mach->links;
|
||
|
mach->mach_params.link_mask = mach->link_mask;
|
||
|
@@ -1309,6 +1327,40 @@ void hda_machine_select(struct snd_sof_dev *sdev)
|
||
|
|
||
|
/* report SSP link mask to machine driver */
|
||
|
mach->mach_params.i2s_link_mask = check_nhlt_ssp_mask(sdev);
|
||
|
+
|
||
|
+ if (mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER &&
|
||
|
+ mach->mach_params.i2s_link_mask) {
|
||
|
+ int ssp_num;
|
||
|
+
|
||
|
+ if (hweight_long(mach->mach_params.i2s_link_mask) > 1 &&
|
||
|
+ !(mach->tplg_quirk_mask & SND_SOC_ACPI_TPLG_INTEL_SSP_MSB))
|
||
|
+ dev_warn(sdev->dev, "More than one SSP exposed by NHLT, choosing MSB\n");
|
||
|
+
|
||
|
+ /* fls returns 1-based results, SSPs indices are 0-based */
|
||
|
+ ssp_num = fls(mach->mach_params.i2s_link_mask) - 1;
|
||
|
+
|
||
|
+ tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
|
||
|
+ "%s%s%d",
|
||
|
+ sof_pdata->tplg_filename,
|
||
|
+ "-ssp",
|
||
|
+ ssp_num);
|
||
|
+ if (!tplg_filename)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ sof_pdata->tplg_filename = tplg_filename;
|
||
|
+ add_extension = true;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (add_extension) {
|
||
|
+ tplg_filename = devm_kasprintf(sdev->dev, GFP_KERNEL,
|
||
|
+ "%s%s",
|
||
|
+ sof_pdata->tplg_filename,
|
||
|
+ ".tplg");
|
||
|
+ if (!tplg_filename)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
+ sof_pdata->tplg_filename = tplg_filename;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
--
|
||
|
2.35.2
|
||
|
|