summaryrefslogtreecommitdiff
path: root/sound/soc/sof
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>2026-07-30 15:17:27 +0300
committerMark Brown <broonie@kernel.org>2026-08-04 17:31:00 +0100
commitb843df095061b152b3ce7450ec293cc65a23bb9f (patch)
tree5c2d8e11b38ad28db35ec84c3eda8eda7400e6cd /sound/soc/sof
parent075b74841bd0065a3bda3440873c747938e69b68 (diff)
ASoC: SOF: ipc4-topology: Store the params change between input/output of a module
Based on the input and output formats we can evaluate what param might be changed by the module instance. If there is a difference between the input rate/channels/format and the output rate/channels/format it means that the module can change one or multiple of the params. Store this information during init for later use. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com> Link: https://patch.msgid.link/20260730121729.18673-2-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/sof')
-rw-r--r--sound/soc/sof/ipc4-topology.c41
-rw-r--r--sound/soc/sof/ipc4-topology.h3
2 files changed, 44 insertions, 0 deletions
diff --git a/sound/soc/sof/ipc4-topology.c b/sound/soc/sof/ipc4-topology.c
index 95ad5266b0c6..007c3dd945e0 100644
--- a/sound/soc/sof/ipc4-topology.c
+++ b/sound/soc/sof/ipc4-topology.c
@@ -406,6 +406,39 @@ sof_ipc4_get_input_pin_audio_fmt(struct snd_sof_widget *swidget, int pin_index)
return NULL;
}
+static void
+sof_ipc4_evaluate_params_change(struct sof_ipc4_available_audio_format *available_fmt)
+{
+ struct sof_ipc4_audio_format *fmt;
+ u32 in_rate, in_channels, in_valid_bits;
+ u32 out_rate, out_channels, out_valid_bits;
+ u32 changed_params = 0;
+ int i, j;
+
+ for (i = 0; i < available_fmt->num_input_formats; i++) {
+ fmt = &available_fmt->input_pin_fmts[i].audio_fmt;
+ in_rate = fmt->sampling_frequency;
+ in_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
+ in_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
+
+ for (j = 0; j < available_fmt->num_output_formats; j++) {
+ fmt = &available_fmt->output_pin_fmts[j].audio_fmt;
+ out_rate = fmt->sampling_frequency;
+ out_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
+ out_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
+
+ if (in_rate != out_rate)
+ changed_params |= BIT(SNDRV_PCM_HW_PARAM_RATE);
+ if (in_channels != out_channels)
+ changed_params |= BIT(SNDRV_PCM_HW_PARAM_CHANNELS);
+ if (in_valid_bits != out_valid_bits)
+ changed_params |= BIT(SNDRV_PCM_HW_PARAM_FORMAT);
+ }
+ }
+
+ available_fmt->changed_params = changed_params;
+}
+
/**
* sof_ipc4_get_audio_fmt - get available audio formats from swidget->tuples
* @scomp: pointer to pointer to SOC component
@@ -497,6 +530,8 @@ static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
available_fmt->num_output_formats);
}
+ sof_ipc4_evaluate_params_change(available_fmt);
+
return 0;
err_out:
@@ -661,6 +696,9 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
if (ret)
goto free_copier;
+ /* Copier can only change format */
+ available_fmt->changed_params &= BIT(SNDRV_PCM_HW_PARAM_FORMAT);
+
/*
* This callback is used by host copier and module-to-module copier,
* and only host copier needs to set gtw_cfg.
@@ -789,6 +827,9 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
if (ret)
goto free_copier;
+ /* Copier can only change format */
+ available_fmt->changed_params &= BIT(SNDRV_PCM_HW_PARAM_FORMAT);
+
ret = sof_update_ipc_object(scomp, &node_type,
SOF_COPIER_TOKENS, swidget->tuples,
swidget->num_tuples, sizeof(node_type), 1);
diff --git a/sound/soc/sof/ipc4-topology.h b/sound/soc/sof/ipc4-topology.h
index a289c1d8f3ff..ce086188d6e1 100644
--- a/sound/soc/sof/ipc4-topology.h
+++ b/sound/soc/sof/ipc4-topology.h
@@ -197,12 +197,15 @@ struct sof_ipc4_pin_format {
* @input_pin_fmts: Available input pin formats
* @num_input_formats: Number of input pin formats
* @num_output_formats: Number of output pin formats
+ * @changed_params: Mask of changed params by the module instance between it's
+ * input and output formts (rate, channels, depth)
*/
struct sof_ipc4_available_audio_format {
struct sof_ipc4_pin_format *output_pin_fmts;
struct sof_ipc4_pin_format *input_pin_fmts;
u32 num_input_formats;
u32 num_output_formats;
+ u32 changed_params;
};
/**