@@ -396,6 +396,33 @@ static int skl_be_hw_params(struct snd_pcm_substream *substream,
return skl_tplg_be_update_params(dai, &p_params);
}
+static int skl_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
+{
+ struct skl *skl = get_skl_ctx(dai->dev);
+ struct skl_sst *ctx = skl->skl_sst;
+ struct skl_module_cfg *mconfig;
+ int stream;
+
+ if (dai->playback_active)
+ stream = SNDRV_PCM_STREAM_PLAYBACK;
+ else
+ stream = SNDRV_PCM_STREAM_CAPTURE;
+
+ mconfig = skl_tplg_be_get_cpr_module(dai, stream);
+ if (!mconfig)
+ return -EINVAL;
+
+ /*
+ * To enable ssp clk explicitly before gateway copier is configured,
+ * need to use dma control IPC.
+ * Disable will be done when DSP gateway copier modules are deleted.
+ */
+ if (!tristate)
+ return skl_dsp_set_dma_control(ctx, mconfig);
+
+ return 0;
+}
+
static int skl_decoupled_trigger(struct snd_pcm_substream *substream,
int cmd)
{
@@ -646,7 +673,7 @@ static struct snd_soc_dai_ops skl_dmic_dai_ops = {
static struct snd_soc_dai_ops skl_be_ssp_dai_ops = {
.hw_params = skl_be_hw_params,
- .prepare = skl_be_prepare,
+ .set_tristate = skl_soc_dai_set_tristate,
};
static struct snd_soc_dai_ops skl_link_dai_ops = {