Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions sound/soc/sof/ipc4-topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,23 @@ struct snd_sof_widget *sof_ipc4_find_swidget_by_ids(struct snd_sof_dev *sdev,
return NULL;
}

static u32 sof_ipc4_fmt_cfg_to_type(u32 fmt_cfg)
{
/* Fetch the sample type from the fmt for 8 and 32 bit formats */
u32 __bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt_cfg);

if (__bits == 8 || __bits == 32)
return SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE(fmt_cfg);

/*
* Return LSB integer type for 20 and 24 formats as the firmware is
* handling the LSB/MSB alignment internally, for the kernel this
* should not be taken into account, we treat them as LSB to match with
* the format we support on the PCM side.
*/
return SOF_IPC4_TYPE_LSB_INTEGER;
}

static void sof_ipc4_dbg_audio_format(struct device *dev, struct sof_ipc4_pin_format *pin_fmt,
int num_formats)
{
Expand All @@ -246,8 +263,9 @@ static void sof_ipc4_dbg_audio_format(struct device *dev, struct sof_ipc4_pin_fo
for (i = 0; i < num_formats; i++) {
struct sof_ipc4_audio_format *fmt = &pin_fmt[i].audio_fmt;
dev_dbg(dev,
"Pin #%d: %uHz, %ubit, %luch (ch_map %#x ch_cfg %u interleaving_style %u fmt_cfg %#x) buffer size %d\n",
"Pin #%d: %uHz, %ubit (type: %u), %luch (ch_map %#x ch_cfg %u interleaving_style %u fmt_cfg %#x) buffer size %d\n",
pin_fmt[i].pin_index, fmt->sampling_frequency, fmt->bit_depth,
sof_ipc4_fmt_cfg_to_type(fmt->fmt_cfg),
SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg),
fmt->ch_map, fmt->ch_cfg, fmt->interleaving_style, fmt->fmt_cfg,
pin_fmt[i].buffer_size);
Expand Down Expand Up @@ -1363,23 +1381,6 @@ static int sof_ipc4_widget_assign_instance_id(struct snd_sof_dev *sdev,
return 0;
}

static u32 sof_ipc4_fmt_cfg_to_type(u32 fmt_cfg)
{
/* Fetch the sample type from the fmt for 8 and 32 bit formats */
u32 __bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt_cfg);

if (__bits == 8 || __bits == 32)
return SOF_IPC4_AUDIO_FORMAT_CFG_SAMPLE_TYPE(fmt_cfg);

/*
* Return LSB integer type for 20 and 24 formats as the firmware is
* handling the LSB/MSB alignment internally, for the kernel this
* should not be taken into account, we treat them as LSB to match with
* the format we support on the PCM side.
*/
return SOF_IPC4_TYPE_LSB_INTEGER;
}

/* update hw_params based on the audio stream format */
static int sof_ipc4_update_hw_params(struct snd_sof_dev *sdev, struct snd_pcm_hw_params *params,
struct sof_ipc4_audio_format *fmt, u32 param_to_update)
Expand Down
Loading