mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
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>
This commit is contained in:
parent
075b74841b
commit
b843df0950
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user