]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: Intel: avs: Honor NHLT override when setting up a path
authorCezary Rojewski <cezary.rojewski@intel.com>
Sat, 15 Nov 2025 18:06:27 +0000 (19:06 +0100)
committerMark Brown <broonie@kernel.org>
Sun, 16 Nov 2025 23:59:05 +0000 (23:59 +0000)
In case topology provides NHLT configuration, use it instead of relying
on the table in ACPI tree. Only gateway-related modules e.g.: Copier
care about the process. For those the order of fetching for hardware
configuration becomes:

1) check if NHLT override is set,
2) check if NHLT descriptor override is set,
3) use NHLT from ACPI directly

Such approach ensures no conflicts exist between 1) and 2) and that 1)
always takes precedence.

Co-developed-by: Amadeusz Sławiński <amade@asmblr.net>
Signed-off-by: Amadeusz Sławiński <amade@asmblr.net>
Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Link: https://patch.msgid.link/20251115180627.3589520-3-cezary.rojewski@intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
include/uapi/sound/intel/avs/tokens.h
sound/soc/intel/avs/path.c
sound/soc/intel/avs/topology.c
sound/soc/intel/avs/topology.h

index f7cbbfb00227add1362636c6f17c3cba1f49e3ba..3ff6d9150822f232d83c3883dd37e13d8fca6acc 100644 (file)
@@ -125,6 +125,7 @@ enum avs_tplg_token {
        AVS_TKN_MOD_KCONTROL_ID_U32                     = 1707,
        AVS_TKN_MOD_INIT_CONFIG_NUM_IDS_U32             = 1708,
        AVS_TKN_MOD_INIT_CONFIG_ID_U32                  = 1709,
+       AVS_TKN_MOD_NHLT_CONFIG_ID_U32                  = 1710,
 
        /* struct avs_tplg_path_template */
        AVS_TKN_PATH_TMPL_ID_U32                        = 1801,
index 7aa20fcf1a33b5efa4a944d53ac7559dad5fa795..c8b586aced2061431e6d7eee012d73497af2efa5 100644 (file)
@@ -210,9 +210,11 @@ int avs_path_set_constraint(struct avs_dev *adev, struct avs_tplg_path_template
                                        continue;
                                }
 
-                               blob = avs_nhlt_config_or_default(adev, module_template);
-                               if (IS_ERR(blob))
-                                       continue;
+                               if (!module_template->nhlt_config) {
+                                       blob = avs_nhlt_config_or_default(adev, module_template);
+                                       if (IS_ERR(blob))
+                                               continue;
+                               }
 
                                rlist[i] = path_template->fe_fmt->sampling_freq;
                                clist[i] = path_template->fe_fmt->num_channels;
@@ -382,7 +384,10 @@ static int avs_fill_gtw_config(struct avs_dev *adev, struct avs_copier_gtw_cfg *
        struct acpi_nhlt_config *blob;
        size_t gtw_size;
 
-       blob = avs_nhlt_config_or_default(adev, t);
+       if (t->nhlt_config)
+               blob = t->nhlt_config->blob;
+       else
+               blob = avs_nhlt_config_or_default(adev, t);
        if (IS_ERR(blob))
                return PTR_ERR(blob);
 
index 48fdbaef56ddb1da681f01784508a6e2877f7f00..9033f683393c43ec1fc580b18574eee24347ffaa 100644 (file)
@@ -350,6 +350,7 @@ AVS_DEFINE_PTR_PARSER(modcfg_base, struct avs_tplg_modcfg_base, modcfgs_base);
 AVS_DEFINE_PTR_PARSER(modcfg_ext, struct avs_tplg_modcfg_ext, modcfgs_ext);
 AVS_DEFINE_PTR_PARSER(pplcfg, struct avs_tplg_pplcfg, pplcfgs);
 AVS_DEFINE_PTR_PARSER(binding, struct avs_tplg_binding, bindings);
+AVS_DEFINE_PTR_PARSER(nhlt_config, struct avs_tplg_nhlt_config, nhlt_configs);
 
 static int
 parse_audio_format_bitfield(struct snd_soc_component *comp, void *elem, void *object, u32 offset)
@@ -1200,6 +1201,12 @@ static const struct avs_tplg_token_parser module_parsers[] = {
                .offset = offsetof(struct avs_tplg_module, num_config_ids),
                .parse = avs_parse_byte_token,
        },
+       {
+               .token = AVS_TKN_MOD_NHLT_CONFIG_ID_U32,
+               .type = SND_SOC_TPLG_TUPLE_TYPE_WORD,
+               .offset = offsetof(struct avs_tplg_module, nhlt_config),
+               .parse = avs_parse_nhlt_config_ptr,
+       },
 };
 
 static const struct avs_tplg_token_parser init_config_parsers[] = {
index 61d50960ef06e2e6a19f7ff05c94b22d2e00459c..1cf7455b6c0107c4959e506761db622b9062f683 100644 (file)
@@ -223,6 +223,7 @@ struct avs_tplg_module {
        u32 ctl_id;
        u32 num_config_ids;
        u32 *config_ids;
+       struct avs_tplg_nhlt_config *nhlt_config;
 
        struct avs_tplg_pipeline *owner;
        /* Pipeline modules management. */