Skip to content

Commit db5a3f8

Browse files
Szymon Mielczarekbroonie
authored andcommitted
ASoC: Intel: Skylake: Support modules with generic extension
Some DSP modules require, besides the module base configuration, a generic extension containing audio format for all module's pins that are in use. Signed-off-by: Gustaw Lewandowski <[email protected]> Signed-off-by: Szymon Mielczarek <[email protected]> Signed-off-by: Cezary Rojewski <[email protected]> Tested-by: Lukasz Majczak <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent a4ad42d commit db5a3f8

File tree

2 files changed

+84
-13
lines changed

2 files changed

+84
-13
lines changed

sound/soc/intel/skylake/skl-messages.c

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,75 @@ static void skl_set_base_module_format(struct skl_dev *skl,
472472
base_cfg->is_pages = res->is_pages;
473473
}
474474

475+
static void fill_pin_params(struct skl_audio_data_format *pin_fmt,
476+
struct skl_module_fmt *format)
477+
{
478+
pin_fmt->number_of_channels = format->channels;
479+
pin_fmt->s_freq = format->s_freq;
480+
pin_fmt->bit_depth = format->bit_depth;
481+
pin_fmt->valid_bit_depth = format->valid_bit_depth;
482+
pin_fmt->ch_cfg = format->ch_cfg;
483+
pin_fmt->sample_type = format->sample_type;
484+
pin_fmt->channel_map = format->ch_map;
485+
pin_fmt->interleaving = format->interleaving_style;
486+
}
487+
488+
/*
489+
* Any module configuration begins with a base module configuration but
490+
* can be followed by a generic extension containing audio format for all
491+
* module's pins that are in use.
492+
*/
493+
static void skl_set_base_ext_module_format(struct skl_dev *skl,
494+
struct skl_module_cfg *mconfig,
495+
struct skl_base_cfg_ext *base_cfg_ext)
496+
{
497+
struct skl_module *module = mconfig->module;
498+
struct skl_module_pin_resources *pin_res;
499+
struct skl_module_iface *fmt = &module->formats[mconfig->fmt_idx];
500+
struct skl_module_res *res = &module->resources[mconfig->res_idx];
501+
struct skl_module_fmt *format;
502+
struct skl_pin_format *pin_fmt;
503+
char *params;
504+
int i;
505+
506+
base_cfg_ext->nr_input_pins = res->nr_input_pins;
507+
base_cfg_ext->nr_output_pins = res->nr_output_pins;
508+
base_cfg_ext->priv_param_length =
509+
mconfig->formats_config[SKL_PARAM_INIT].caps_size;
510+
511+
for (i = 0; i < res->nr_input_pins; i++) {
512+
pin_res = &res->input[i];
513+
pin_fmt = &base_cfg_ext->pins_fmt[i];
514+
515+
pin_fmt->pin_idx = pin_res->pin_index;
516+
pin_fmt->buf_size = pin_res->buf_size;
517+
518+
format = &fmt->inputs[pin_res->pin_index].fmt;
519+
fill_pin_params(&pin_fmt->audio_fmt, format);
520+
}
521+
522+
for (i = 0; i < res->nr_output_pins; i++) {
523+
pin_res = &res->output[i];
524+
pin_fmt = &base_cfg_ext->pins_fmt[res->nr_input_pins + i];
525+
526+
pin_fmt->pin_idx = pin_res->pin_index;
527+
pin_fmt->buf_size = pin_res->buf_size;
528+
529+
format = &fmt->outputs[pin_res->pin_index].fmt;
530+
fill_pin_params(&pin_fmt->audio_fmt, format);
531+
}
532+
533+
if (!base_cfg_ext->priv_param_length)
534+
return;
535+
536+
params = (char *)base_cfg_ext + sizeof(struct skl_base_cfg_ext);
537+
params += (base_cfg_ext->nr_input_pins + base_cfg_ext->nr_output_pins) *
538+
sizeof(struct skl_pin_format);
539+
540+
memcpy(params, mconfig->formats_config[SKL_PARAM_INIT].caps,
541+
mconfig->formats_config[SKL_PARAM_INIT].caps_size);
542+
}
543+
475544
/*
476545
* Copies copier capabilities into copier module and updates copier module
477546
* config size.
@@ -1091,19 +1160,6 @@ int skl_unbind_modules(struct skl_dev *skl,
10911160
return ret;
10921161
}
10931162

1094-
static void fill_pin_params(struct skl_audio_data_format *pin_fmt,
1095-
struct skl_module_fmt *format)
1096-
{
1097-
pin_fmt->number_of_channels = format->channels;
1098-
pin_fmt->s_freq = format->s_freq;
1099-
pin_fmt->bit_depth = format->bit_depth;
1100-
pin_fmt->valid_bit_depth = format->valid_bit_depth;
1101-
pin_fmt->ch_cfg = format->ch_cfg;
1102-
pin_fmt->sample_type = format->sample_type;
1103-
pin_fmt->channel_map = format->ch_map;
1104-
pin_fmt->interleaving = format->interleaving_style;
1105-
}
1106-
11071163
#define CPR_SINK_FMT_PARAM_ID 2
11081164

11091165
/*

sound/soc/intel/skylake/skl-topology.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,21 @@ struct skl_up_down_mixer_cfg {
152152
u32 ch_map;
153153
} __packed;
154154

155+
struct skl_pin_format {
156+
u32 pin_idx;
157+
u32 buf_size;
158+
struct skl_audio_data_format audio_fmt;
159+
} __packed;
160+
161+
struct skl_base_cfg_ext {
162+
u16 nr_input_pins;
163+
u16 nr_output_pins;
164+
u8 reserved[8];
165+
u32 priv_param_length;
166+
/* Input pin formats followed by output ones. */
167+
struct skl_pin_format pins_fmt[0];
168+
} __packed;
169+
155170
struct skl_algo_cfg {
156171
struct skl_base_cfg base_cfg;
157172
char params[];

0 commit comments

Comments
 (0)