return 0;
 }
 
+static int imx_ssi_startup(struct snd_pcm_substream *substream,
+                          struct snd_soc_dai *cpu_dai)
+{
+       struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
+       struct imx_pcm_dma_params *dma_data;
+
+       /* Tx/Rx config */
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+               dma_data = &ssi->dma_params_tx;
+       else
+               dma_data = &ssi->dma_params_rx;
+
+       snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
+
+       return 0;
+}
+
 /*
  * Should only be called when port is inactive (i.e. SSIEN = 0),
  * although can be called multiple times by upper layers.
                             struct snd_soc_dai *cpu_dai)
 {
        struct imx_ssi *ssi = snd_soc_dai_get_drvdata(cpu_dai);
-       struct imx_pcm_dma_params *dma_data;
        u32 reg, sccr;
 
        /* Tx/Rx config */
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                reg = SSI_STCCR;
-               dma_data = &ssi->dma_params_tx;
-       } else {
+       else
                reg = SSI_SRCCR;
-               dma_data = &ssi->dma_params_rx;
-       }
 
        if (ssi->flags & IMX_SSI_SYN)
                reg = SSI_STCCR;
 
-       snd_soc_dai_set_dma_data(cpu_dai, substream, dma_data);
-
        sccr = readl(ssi->base + reg) & ~SSI_STCCR_WL_MASK;
 
        /* DAI data (word) size */
 }
 
 static const struct snd_soc_dai_ops imx_ssi_pcm_dai_ops = {
+       .startup        = imx_ssi_startup,
        .hw_params      = imx_ssi_hw_params,
        .set_fmt        = imx_ssi_set_dai_fmt,
        .set_clkdiv     = imx_ssi_set_dai_clkdiv,