summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2025-12-16 23:57:21 +0300
committerMark Brown <broonie@kernel.org>2025-12-16 23:57:21 +0300
commite3b88652b66b6b899eb1049694b214267b4e6c79 (patch)
treeb643e83181e081f3aa70b0babbf9eee66e14ce89
parent544c0494cdb3732281e1f2e279cfa561724355db (diff)
parent91b7f7d0eedaaa8993e662c4c6db9b3cfe8a2faf (diff)
downloadlinux-e3b88652b66b6b899eb1049694b214267b4e6c79.tar.xz
ASoC: Intel: common / SOF: Use function topologies for
Merge series from Peter Ujfalusi <peter.ujfalusi@linux.intel.com>: support for NVL-S and the support using functional topology fragments for Soundwire configurations is introduced in 6.19-rc1 in parallel. The SOF projects plan is to not create individual topology files for NVL as with SDCA and the functional topology support can handle most if not all soundwire devices going forward. However one issue have been identified with the functional topology only support, which was masked by the presence of a single topology file: if the device contains a dai link for which we don't have topology fragment, then the probe will fail. This worked with a fallback to a monolithic topology file - which made the dai link to be ignored. The first patch in the series adds a flag to instruct the function discovery to make a best effort to form a card by ignoring functions without corresponding fragment (and print this out for developers) in case there is no fallback topology available. The second patch removes the match entry to refer to a topology file which will not be built by the SOF project.
-rw-r--r--include/sound/soc-acpi.h5
-rw-r--r--sound/soc/intel/common/soc-acpi-intel-nvl-match.c49
-rw-r--r--sound/soc/intel/common/sof-function-topology-lib.c5
-rw-r--r--sound/soc/intel/common/sof-function-topology-lib.h2
-rw-r--r--sound/soc/sof/topology.c18
5 files changed, 26 insertions, 53 deletions
diff --git a/include/sound/soc-acpi.h b/include/sound/soc-acpi.h
index 90d73b9bddab..0519afd7217f 100644
--- a/include/sound/soc-acpi.h
+++ b/include/sound/soc-acpi.h
@@ -203,6 +203,8 @@ struct snd_soc_acpi_link_adr {
* @mach: the pointer of the machine driver
* @prefix: the prefix of the topology file name. Typically, it is the path.
* @tplg_files: the pointer of the array of the topology file names.
+ * @best_effort: ignore non supported links and try to build the card in best effort
+ * with supported links
*/
/* Descriptor for SST ASoC machine driver */
struct snd_soc_acpi_mach {
@@ -224,7 +226,8 @@ struct snd_soc_acpi_mach {
const u32 tplg_quirk_mask;
int (*get_function_tplg_files)(struct snd_soc_card *card,
const struct snd_soc_acpi_mach *mach,
- const char *prefix, const char ***tplg_files);
+ const char *prefix, const char ***tplg_files,
+ bool best_effort);
};
#define SND_SOC_ACPI_MAX_CODECS 3
diff --git a/sound/soc/intel/common/soc-acpi-intel-nvl-match.c b/sound/soc/intel/common/soc-acpi-intel-nvl-match.c
index 2768dd10aaa0..b8695d47e55b 100644
--- a/sound/soc/intel/common/soc-acpi-intel-nvl-match.c
+++ b/sound/soc/intel/common/soc-acpi-intel-nvl-match.c
@@ -15,49 +15,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_machines[] = {
};
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_machines);
-/*
- * Multi-function codecs with three endpoints created for
- * headset, amp and dmic functions.
- */
-static const struct snd_soc_acpi_endpoint rt_mf_endpoints[] = {
- {
- .num = 0,
- .aggregated = 0,
- .group_position = 0,
- .group_id = 0,
- },
- {
- .num = 1,
- .aggregated = 0,
- .group_position = 0,
- .group_id = 0,
- },
- {
- .num = 2,
- .aggregated = 0,
- .group_position = 0,
- .group_id = 0,
- },
-};
-
-static const struct snd_soc_acpi_adr_device rt722_3_single_adr[] = {
- {
- .adr = 0x000330025d072201ull,
- .num_endpoints = ARRAY_SIZE(rt_mf_endpoints),
- .endpoints = rt_mf_endpoints,
- .name_prefix = "rt722"
- }
-};
-
-static const struct snd_soc_acpi_link_adr nvl_rt722_l3[] = {
- {
- .mask = BIT(3),
- .num_adr = ARRAY_SIZE(rt722_3_single_adr),
- .adr_d = rt722_3_single_adr,
- },
- {}
-};
-
/* this table is used when there is no I2S codec present */
struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
/* mockup tests need to be first */
@@ -79,12 +36,6 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_nvl_sdw_machines[] = {
.drv_name = "sof_sdw",
.sof_tplg_filename = "sof-nvl-rt715-rt711-rt1308-mono.tplg",
},
- {
- .link_mask = BIT(3),
- .links = nvl_rt722_l3,
- .drv_name = "sof_sdw",
- .sof_tplg_filename = "sof-nvl-rt722.tplg",
- },
{},
};
EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_nvl_sdw_machines);
diff --git a/sound/soc/intel/common/sof-function-topology-lib.c b/sound/soc/intel/common/sof-function-topology-lib.c
index b10d4794159a..0daa7d83808b 100644
--- a/sound/soc/intel/common/sof-function-topology-lib.c
+++ b/sound/soc/intel/common/sof-function-topology-lib.c
@@ -28,7 +28,7 @@ enum tplg_device_id {
#define SOF_INTEL_PLATFORM_NAME_MAX 4
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
- const char *prefix, const char ***tplg_files)
+ const char *prefix, const char ***tplg_files, bool best_effort)
{
struct snd_soc_acpi_mach_params mach_params = mach->mach_params;
struct snd_soc_dai_link *dai_link;
@@ -87,6 +87,9 @@ int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_
dev_dbg(card->dev,
"dai_link %s is not supported by separated tplg yet\n",
dai_link->name);
+ if (best_effort)
+ continue;
+
return 0;
}
if (tplg_mask & BIT(tplg_dev))
diff --git a/sound/soc/intel/common/sof-function-topology-lib.h b/sound/soc/intel/common/sof-function-topology-lib.h
index e7d0c39d0788..f358f8c52d78 100644
--- a/sound/soc/intel/common/sof-function-topology-lib.h
+++ b/sound/soc/intel/common/sof-function-topology-lib.h
@@ -10,6 +10,6 @@
#define _SND_SOC_ACPI_INTEL_GET_TPLG_H
int sof_sdw_get_tplg_files(struct snd_soc_card *card, const struct snd_soc_acpi_mach *mach,
- const char *prefix, const char ***tplg_files);
+ const char *prefix, const char ***tplg_files, bool best_effort);
#endif
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index 6b09b8cdf1cb..9bf8ab610a7e 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -2506,12 +2506,28 @@ int snd_sof_load_topology(struct snd_soc_component *scomp, const char *file)
if (!tplg_files)
return -ENOMEM;
+ /* Try to use function topologies if possible */
if (!sof_pdata->disable_function_topology && !disable_function_topology &&
sof_pdata->machine && sof_pdata->machine->get_function_tplg_files) {
+ /*
+ * When the topology name contains 'dummy' word, it means that
+ * there is no fallback option to monolithic topology in case
+ * any of the function topologies might be missing.
+ * In this case we should use best effort to form the card,
+ * ignoring functionalities that we are missing a fragment for.
+ *
+ * Note: monolithic topologies also ignore these possibly
+ * missing functions, so the functionality of the card would be
+ * identical to the case if there would be a fallback monolithic
+ * topology created for the configuration.
+ */
+ bool no_fallback = strstr(file, "dummy");
+
tplg_cnt = sof_pdata->machine->get_function_tplg_files(scomp->card,
sof_pdata->machine,
tplg_filename_prefix,
- &tplg_files);
+ &tplg_files,
+ no_fallback);
if (tplg_cnt < 0) {
kfree(tplg_files);
return tplg_cnt;