ASoC: Intel: avs: Make PEAKVOL configurable from topology

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>
This commit is contained in:
Cezary Rojewski 2025-02-17 11:21:08 +01:00 committed by Mark Brown
parent 81eb3a2bd2
commit 28feec15fa
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
4 changed files with 29 additions and 2 deletions

View 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,

View 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);

View 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[] = {

View 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;
};
};