/* * DSP needs SRC module for frequency conversion, SRC takes base module * configuration and the target frequency as extra parameter passed as src * config */ static void skl_set_src_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_src_module_cfg *src_mconfig) { struct skl_module_fmt *fmt = &mconfig->out_fmt[0]; skl_set_base_module_format(ctx, mconfig, (struct skl_base_cfg *)src_mconfig); src_mconfig->src_cfg = fmt->s_freq; }
/* * Mic select module allows selecting one or many input channels, thus * acting as a demux. * * Mic select module take base module configuration and out-format * configuration */ static void skl_set_base_outfmt_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_base_outfmt_cfg *base_outfmt_mcfg) { struct skl_audio_data_format *out_fmt = &base_outfmt_mcfg->out_fmt; struct skl_base_cfg *base_cfg = (struct skl_base_cfg *)base_outfmt_mcfg; skl_set_base_module_format(ctx, mconfig, base_cfg); skl_setup_out_format(ctx, mconfig, out_fmt); }
/* * 'copier' is DSP internal module which copies data from Host DMA (HDA host * dma) or link (hda link, SSP, PDM) * Here we calculate the copier module parameters, like PCM format, output * format, gateway settings * copier_module_config is sent as input buffer with INIT_INSTANCE IPC msg */ static void skl_set_copier_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_cpr_cfg *cpr_mconfig) { struct skl_audio_data_format *out_fmt = &cpr_mconfig->out_fmt; struct skl_base_cfg *base_cfg = (struct skl_base_cfg *)cpr_mconfig; skl_set_base_module_format(ctx, mconfig, base_cfg); skl_setup_out_format(ctx, mconfig, out_fmt); skl_setup_cpr_gateway_cfg(ctx, mconfig, cpr_mconfig); }
/* * DSP needs updown module to do channel conversion. updown module take base * module configuration and channel configuration * It also take coefficients and now we have defaults applied here */ static void skl_set_updown_mixer_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_up_down_mixer_cfg *mixer_mconfig) { struct skl_module *module = mconfig->module; struct skl_module_iface *iface = &module->formats[mconfig->fmt_idx]; struct skl_module_fmt *fmt = &iface->outputs[0].fmt; skl_set_base_module_format(ctx, mconfig, (struct skl_base_cfg *)mixer_mconfig); mixer_mconfig->out_ch_cfg = fmt->ch_cfg; mixer_mconfig->ch_map = fmt->ch_map; }
/* * DSP needs SRC module for frequency conversion, SRC takes base module * configuration and the target frequency as extra parameter passed as src * config */ static void skl_set_src_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_src_module_cfg *src_mconfig) { struct skl_module *module = mconfig->module; struct skl_module_iface *iface = &module->formats[mconfig->fmt_idx]; struct skl_module_fmt *fmt = &iface->outputs[0].fmt; skl_set_base_module_format(ctx, mconfig, (struct skl_base_cfg *)src_mconfig); src_mconfig->src_cfg = fmt->s_freq; }
static int skl_set_module_format(struct skl_sst *ctx, struct skl_module_cfg *module_config, u16 *module_config_size, void **param_data) { u16 param_size; param_size = skl_get_module_param_size(ctx, module_config); *param_data = kzalloc(param_size, GFP_KERNEL); if (NULL == *param_data) return -ENOMEM; *module_config_size = param_size; switch (module_config->m_type) { case SKL_MODULE_TYPE_COPIER: skl_set_copier_format(ctx, module_config, *param_data); break; case SKL_MODULE_TYPE_SRCINT: skl_set_src_format(ctx, module_config, *param_data); break; case SKL_MODULE_TYPE_UPDWMIX: skl_set_updown_mixer_format(ctx, module_config, *param_data); break; case SKL_MODULE_TYPE_ALGO: skl_set_algo_format(ctx, module_config, *param_data); break; case SKL_MODULE_TYPE_BASE_OUTFMT: case SKL_MODULE_TYPE_MIC_SELECT: case SKL_MODULE_TYPE_KPB: skl_set_base_outfmt_format(ctx, module_config, *param_data); break; default: skl_set_base_module_format(ctx, module_config, *param_data); break; } dev_dbg(ctx->dev, "Module type=%d config size: %d bytes\n", module_config->id.module_id, param_size); print_hex_dump_debug("Module params:", DUMP_PREFIX_OFFSET, 8, 4, *param_data, param_size, false); return 0; }
static void skl_set_algo_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_algo_cfg *algo_mcfg) { struct skl_base_cfg *base_cfg = (struct skl_base_cfg *)algo_mcfg; skl_set_base_module_format(ctx, mconfig, base_cfg); if (mconfig->formats_config.caps_size == 0) return; memcpy(algo_mcfg->params, mconfig->formats_config.caps, mconfig->formats_config.caps_size); }
/* * DSP needs updown module to do channel conversion. updown module take base * module configuration and channel configuration * It also take coefficients and now we have defaults applied here */ static void skl_set_updown_mixer_format(struct skl_sst *ctx, struct skl_module_cfg *mconfig, struct skl_up_down_mixer_cfg *mixer_mconfig) { struct skl_module_fmt *fmt = &mconfig->out_fmt[0]; int i = 0; skl_set_base_module_format(ctx, mconfig, (struct skl_base_cfg *)mixer_mconfig); mixer_mconfig->out_ch_cfg = fmt->ch_cfg; /* Select F/W default coefficient */ mixer_mconfig->coeff_sel = 0x0; /* User coeff, don't care since we are selecting F/W defaults */ for (i = 0; i < UP_DOWN_MIXER_MAX_COEFF; i++) mixer_mconfig->coeff[i] = 0xDEADBEEF; }