|
@@ -545,6 +545,66 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Some modules require params to be set after the module is bound to
|
|
|
|
+ * all pins connected.
|
|
|
|
+ *
|
|
|
|
+ * The module provider initializes set_param flag for such modules and we
|
|
|
|
+ * send params after binding
|
|
|
|
+ */
|
|
|
|
+static int skl_tplg_set_module_bind_params(struct snd_soc_dapm_widget *w,
|
|
|
|
+ struct skl_module_cfg *mcfg, struct skl_sst *ctx)
|
|
|
|
+{
|
|
|
|
+ int i, ret;
|
|
|
|
+ struct skl_module_cfg *mconfig = w->priv;
|
|
|
|
+ const struct snd_kcontrol_new *k;
|
|
|
|
+ struct soc_bytes_ext *sb;
|
|
|
|
+ struct skl_algo_data *bc;
|
|
|
|
+ struct skl_specific_cfg *sp_cfg;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * check all out/in pins are in bind state.
|
|
|
|
+ * if so set the module param
|
|
|
|
+ */
|
|
|
|
+ for (i = 0; i < mcfg->max_out_queue; i++) {
|
|
|
|
+ if (mcfg->m_out_pin[i].pin_state != SKL_PIN_BIND_DONE)
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < mcfg->max_in_queue; i++) {
|
|
|
|
+ if (mcfg->m_in_pin[i].pin_state != SKL_PIN_BIND_DONE)
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mconfig->formats_config.caps_size > 0 &&
|
|
|
|
+ mconfig->formats_config.set_params == SKL_PARAM_BIND) {
|
|
|
|
+ sp_cfg = &mconfig->formats_config;
|
|
|
|
+ ret = skl_set_module_params(ctx, sp_cfg->caps,
|
|
|
|
+ sp_cfg->caps_size,
|
|
|
|
+ sp_cfg->param_id, mconfig);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < w->num_kcontrols; i++) {
|
|
|
|
+ k = &w->kcontrol_news[i];
|
|
|
|
+ if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
|
|
|
|
+ sb = (void *) k->private_value;
|
|
|
|
+ bc = (struct skl_algo_data *)sb->dobj.private;
|
|
|
|
+
|
|
|
|
+ if (bc->set_params == SKL_PARAM_BIND) {
|
|
|
|
+ ret = skl_set_module_params(ctx,
|
|
|
|
+ (u32 *)bc->params, bc->max,
|
|
|
|
+ bc->param_id, mconfig);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
|
|
static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
|
|
struct skl *skl,
|
|
struct skl *skl,
|
|
struct snd_soc_dapm_widget *src_w,
|
|
struct snd_soc_dapm_widget *src_w,
|
|
@@ -579,11 +639,19 @@ static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
|
|
sink = p->sink;
|
|
sink = p->sink;
|
|
sink_mconfig = sink->priv;
|
|
sink_mconfig = sink->priv;
|
|
|
|
|
|
|
|
+ if (src_mconfig->m_state == SKL_MODULE_UNINIT ||
|
|
|
|
+ sink_mconfig->m_state == SKL_MODULE_UNINIT)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
/* Bind source to sink, mixin is always source */
|
|
/* Bind source to sink, mixin is always source */
|
|
ret = skl_bind_modules(ctx, src_mconfig, sink_mconfig);
|
|
ret = skl_bind_modules(ctx, src_mconfig, sink_mconfig);
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+ /* set module params after bind */
|
|
|
|
+ skl_tplg_set_module_bind_params(src_w, src_mconfig, ctx);
|
|
|
|
+ skl_tplg_set_module_bind_params(sink, sink_mconfig, ctx);
|
|
|
|
+
|
|
/* Start sinks pipe first */
|
|
/* Start sinks pipe first */
|
|
if (sink_mconfig->pipe->state != SKL_PIPE_STARTED) {
|
|
if (sink_mconfig->pipe->state != SKL_PIPE_STARTED) {
|
|
if (sink_mconfig->pipe->conn_type !=
|
|
if (sink_mconfig->pipe->conn_type !=
|
|
@@ -714,6 +782,10 @@ static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+ /* set module params after bind */
|
|
|
|
+ skl_tplg_set_module_bind_params(source, src_mconfig, ctx);
|
|
|
|
+ skl_tplg_set_module_bind_params(sink, sink_mconfig, ctx);
|
|
|
|
+
|
|
if (sink_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
|
|
if (sink_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
|
|
ret = skl_run_pipe(ctx, sink_mconfig->pipe);
|
|
ret = skl_run_pipe(ctx, sink_mconfig->pipe);
|
|
}
|
|
}
|