]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: Intel: avs: Make PEAKVOL configurable from topology
authorCezary Rojewski <cezary.rojewski@intel.com>
Mon, 17 Feb 2025 10:21:08 +0000 (11:21 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 24 Feb 2025 16:01:53 +0000 (16:01 +0000)
The driver exposes volume kcontrols if PEAKVOL/GAIN module is present
in the streaming path. Currently there is no control over their default
values including the effect that may accompany the volume change event.

Add template for PEAKVOL/GAIN module which holds all the information
needed to address the limitation.

Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com>
Link: https://patch.msgid.link/20250217102115.3539427-4-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 06ff30537f47492fd986a996b6c5e69475e236b2..c9f845b3c52306326d080933cdc089554fc67292 100644 (file)
@@ -84,6 +84,10 @@ enum avs_tplg_token {
        AVS_TKN_MODCFG_WHM_DMA_TYPE_U32                 = 437,
        AVS_TKN_MODCFG_WHM_DMABUFF_SIZE_U32             = 438,
        AVS_TKN_MODCFG_WHM_BLOB_AFMT_ID_U32             = 439,
+       AVS_TKN_MODCFG_PEAKVOL_VOLUME_U32               = 440,
+       AVS_TKN_MODCFG_PEAKVOL_CHANNEL_ID_U32           = 441, /* reserved */
+       AVS_TKN_MODCFG_PEAKVOL_CURVE_TYPE_U32           = 442,
+       AVS_TKN_MODCFG_PEAKVOL_CURVE_DURATION_U32       = 443,
 
        /* struct avs_tplg_pplcfg */
        AVS_TKN_PPLCFG_ID_U32                           = 1401,
index dfb85bd2b6657fa5df1adf0a7b257cba9122fabf..32983811901591e10d38d41c0ebc54e7200f58d1 100644 (file)
@@ -350,8 +350,8 @@ static int avs_peakvol_create(struct avs_dev *adev, struct avs_path_module *mod)
        cfg->base.audio_fmt = *t->in_fmt;
        cfg->vols[0].target_volume = volume;
        cfg->vols[0].channel_id = AVS_ALL_CHANNELS_MASK;
-       cfg->vols[0].curve_type = AVS_AUDIO_CURVE_NONE;
-       cfg->vols[0].curve_duration = 0;
+       cfg->vols[0].curve_type = t->cfg_ext->peakvol.curve_type;
+       cfg->vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration;
 
        ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id,
                                  t->domain, cfg, cfg_size, &mod->instance_id);
index 471b00b9a149eab89616df91753655c7278753db..45952fbe9694bf930e7aff030bdf342eaa2196a4 100644 (file)
@@ -857,6 +857,24 @@ static const struct avs_tplg_token_parser modcfg_ext_parsers[] = {
                .offset = offsetof(struct avs_tplg_modcfg_ext, whm.blob_fmt),
                .parse = avs_parse_audio_format_ptr,
        },
+       {
+               .token = AVS_TKN_MODCFG_PEAKVOL_VOLUME_U32,
+               .type = SND_SOC_TPLG_TUPLE_TYPE_WORD,
+               .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.target_volume),
+               .parse = avs_parse_word_token,
+       },
+       {
+               .token = AVS_TKN_MODCFG_PEAKVOL_CURVE_TYPE_U32,
+               .type = SND_SOC_TPLG_TUPLE_TYPE_WORD,
+               .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.curve_type),
+               .parse = avs_parse_word_token,
+       },
+       {
+               .token = AVS_TKN_MODCFG_PEAKVOL_CURVE_DURATION_U32,
+               .type = SND_SOC_TPLG_TUPLE_TYPE_WORD,
+               .offset = offsetof(struct avs_tplg_modcfg_ext, peakvol.curve_duration),
+               .parse = avs_parse_word_token,
+       },
 };
 
 static const struct avs_tplg_token_parser pin_format_parsers[] = {
index 23d5ccd199595c4a66d48a88af8d38c3468841de..30488099771736583918a7ecb8de87604e354641 100644 (file)
@@ -113,6 +113,11 @@ struct avs_tplg_modcfg_ext {
                struct {
                        struct avs_audio_format *out_fmt;
                } micsel;
+               struct {
+                       u32 target_volume;
+                       u32 curve_type;
+                       u32 curve_duration;
+               } peakvol;
        };
 };