forked from Minki/linux
ASoC: Intel: Skylake: Add IPC to configure the copier secondary pins
Copier can support upto 4 output pins. However, only pin 0 is configured as a part of copier initialization. Configuring rest of pins require the separate IPC to be sent to fw. Signed-off-by: Pradeep Tewani <pradeep.d.tewani@intel.com> Acked-By: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
b21f0522ee
commit
38a770859e
@ -1083,6 +1083,21 @@ int skl_unbind_modules(struct skl_sst *ctx,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void fill_pin_params(struct skl_audio_data_format *pin_fmt,
|
||||
struct skl_module_fmt *format)
|
||||
{
|
||||
pin_fmt->number_of_channels = format->channels;
|
||||
pin_fmt->s_freq = format->s_freq;
|
||||
pin_fmt->bit_depth = format->bit_depth;
|
||||
pin_fmt->valid_bit_depth = format->valid_bit_depth;
|
||||
pin_fmt->ch_cfg = format->ch_cfg;
|
||||
pin_fmt->sample_type = format->sample_type;
|
||||
pin_fmt->channel_map = format->ch_map;
|
||||
pin_fmt->interleaving = format->interleaving_style;
|
||||
}
|
||||
|
||||
#define CPR_SINK_FMT_PARAM_ID 2
|
||||
|
||||
/*
|
||||
* Once a module is instantiated it need to be 'bind' with other modules in
|
||||
* the pipeline. For binding we need to find the module pins which are bind
|
||||
@ -1094,11 +1109,15 @@ int skl_bind_modules(struct skl_sst *ctx,
|
||||
struct skl_module_cfg *src_mcfg,
|
||||
struct skl_module_cfg *dst_mcfg)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
struct skl_ipc_bind_unbind_msg msg;
|
||||
int in_max = dst_mcfg->module->max_input_pins;
|
||||
int out_max = src_mcfg->module->max_output_pins;
|
||||
int src_index, dst_index;
|
||||
struct skl_module_fmt *format;
|
||||
struct skl_cpr_pin_fmt pin_fmt;
|
||||
struct skl_module *module;
|
||||
struct skl_module_iface *fmt;
|
||||
|
||||
skl_dump_bind_info(ctx, src_mcfg, dst_mcfg);
|
||||
|
||||
@ -1117,6 +1136,29 @@ int skl_bind_modules(struct skl_sst *ctx,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copier module requires the separate large_config_set_ipc to
|
||||
* configure the pins other than 0
|
||||
*/
|
||||
if (src_mcfg->m_type == SKL_MODULE_TYPE_COPIER && src_index > 0) {
|
||||
pin_fmt.sink_id = src_index;
|
||||
module = src_mcfg->module;
|
||||
fmt = &module->formats[src_mcfg->fmt_idx];
|
||||
|
||||
/* Input fmt is same as that of src module input cfg */
|
||||
format = &fmt->inputs[0].fmt;
|
||||
fill_pin_params(&(pin_fmt.src_fmt), format);
|
||||
|
||||
format = &fmt->outputs[src_index].fmt;
|
||||
fill_pin_params(&(pin_fmt.dst_fmt), format);
|
||||
ret = skl_set_module_params(ctx, (void *)&pin_fmt,
|
||||
sizeof(struct skl_cpr_pin_fmt),
|
||||
CPR_SINK_FMT_PARAM_ID, src_mcfg);
|
||||
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
msg.dst_queue = dst_index;
|
||||
|
||||
dev_dbg(ctx->dev, "src queue = %d dst queue =%d\n",
|
||||
@ -1134,11 +1176,12 @@ int skl_bind_modules(struct skl_sst *ctx,
|
||||
src_mcfg->m_state = SKL_MODULE_BIND_DONE;
|
||||
src_mcfg->m_out_pin[src_index].pin_state = SKL_PIN_BIND_DONE;
|
||||
dst_mcfg->m_in_pin[dst_index].pin_state = SKL_PIN_BIND_DONE;
|
||||
} else {
|
||||
/* error case , if IPC fails, clear the queue index */
|
||||
skl_free_queue(src_mcfg->m_out_pin, src_index);
|
||||
skl_free_queue(dst_mcfg->m_in_pin, dst_index);
|
||||
return ret;
|
||||
}
|
||||
out:
|
||||
/* error case , if IPC fails, clear the queue index */
|
||||
skl_free_queue(src_mcfg->m_out_pin, src_index);
|
||||
skl_free_queue(dst_mcfg->m_in_pin, dst_index);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -138,6 +138,11 @@ struct skl_cpr_cfg {
|
||||
struct skl_cpr_gtw_cfg gtw_cfg;
|
||||
} __packed;
|
||||
|
||||
struct skl_cpr_pin_fmt {
|
||||
u32 sink_id;
|
||||
struct skl_audio_data_format src_fmt;
|
||||
struct skl_audio_data_format dst_fmt;
|
||||
} __packed;
|
||||
|
||||
struct skl_src_module_cfg {
|
||||
struct skl_base_cfg base_cfg;
|
||||
|
Loading…
Reference in New Issue
Block a user