mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 16:37:50 +00:00
ASoC: SOF: ipc4-topology: New helper to check if all output formats are the same
Add a helper function to check if all formats are identical. Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com Link: https://lore.kernel.org/r/20230515103336.16132-9-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org
This commit is contained in:
parent
1af13f221a
commit
f37b702cb6
1 changed files with 31 additions and 22 deletions
|
@ -1028,6 +1028,34 @@ static int sof_ipc4_update_hw_params(struct snd_sof_dev *sdev, struct snd_pcm_hw
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool sof_ipc4_is_single_format(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_pin_format *pin_fmts, u32 pin_fmts_size)
|
||||
{
|
||||
struct sof_ipc4_audio_format *fmt;
|
||||
u32 rate, channels, valid_bits;
|
||||
int i;
|
||||
|
||||
fmt = &pin_fmts[0].audio_fmt;
|
||||
rate = fmt->sampling_frequency;
|
||||
channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
|
||||
valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
|
||||
|
||||
/* check if all output formats in topology are the same */
|
||||
for (i = 1; i < pin_fmts_size; i++) {
|
||||
u32 _rate, _channels, _valid_bits;
|
||||
|
||||
fmt = &pin_fmts[i].audio_fmt;
|
||||
_rate = fmt->sampling_frequency;
|
||||
_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
|
||||
_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
|
||||
|
||||
if (_rate != rate || _channels != channels || _valid_bits != valid_bits)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int sof_ipc4_init_output_audio_fmt(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_base_module_cfg *base_config,
|
||||
struct sof_ipc4_available_audio_format *available_fmt,
|
||||
|
@ -1035,33 +1063,14 @@ static int sof_ipc4_init_output_audio_fmt(struct snd_sof_dev *sdev,
|
|||
u32 out_ref_valid_bits)
|
||||
{
|
||||
struct sof_ipc4_audio_format *out_fmt;
|
||||
u32 out_rate, out_channels, out_valid_bits;
|
||||
bool single_format = true;
|
||||
bool single_format;
|
||||
int i;
|
||||
|
||||
if (!available_fmt->num_output_formats)
|
||||
return -EINVAL;
|
||||
|
||||
out_fmt = &available_fmt->output_pin_fmts[0].audio_fmt;
|
||||
out_rate = out_fmt->sampling_frequency;
|
||||
out_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(out_fmt->fmt_cfg);
|
||||
out_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(out_fmt->fmt_cfg);
|
||||
|
||||
/* check if all output formats in topology are the same */
|
||||
for (i = 1; i < available_fmt->num_output_formats; i++) {
|
||||
u32 _out_rate, _out_channels, _out_valid_bits;
|
||||
|
||||
out_fmt = &available_fmt->output_pin_fmts[i].audio_fmt;
|
||||
_out_rate = out_fmt->sampling_frequency;
|
||||
_out_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(out_fmt->fmt_cfg);
|
||||
_out_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(out_fmt->fmt_cfg);
|
||||
|
||||
if (_out_rate != out_rate || _out_channels != out_channels ||
|
||||
_out_valid_bits != out_valid_bits) {
|
||||
single_format = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
single_format = sof_ipc4_is_single_format(sdev, available_fmt->output_pin_fmts,
|
||||
available_fmt->num_output_formats);
|
||||
|
||||
/* pick the first format if there's only one available or if all formats are the same */
|
||||
if (single_format) {
|
||||
|
|
Loading…
Reference in a new issue