{
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
+               ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
+               if (ret < 0) {
+                       dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
+                               cpu_dai->name, ret);
+                       goto out;
+               }
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->open) {
                ret = platform->driver->compr_ops->open(cstream);
                if (ret < 0) {
                        pr_err("compress asoc: can't open platform %s\n",
                                platform->component.name);
-                       goto out;
+                       goto plat_err;
                }
        }
 
 machine_err:
        if (platform->driver->compr_ops && platform->driver->compr_ops->free)
                platform->driver->compr_ops->free(cstream);
+plat_err:
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
+               cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
 out:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
        struct snd_soc_platform *platform = fe->platform;
+       struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        struct snd_soc_dpcm *dpcm;
        struct snd_soc_dapm_widget_list *list;
        int stream;
 
        mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
+               ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
+               if (ret < 0) {
+                       dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
+                               cpu_dai->name, ret);
+                       goto out;
+               }
+       }
+
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->open) {
                ret = platform->driver->compr_ops->open(cstream);
                if (ret < 0) {
                        pr_err("compress asoc: can't open platform %s\n",
                                platform->component.name);
-                       goto out;
+                       goto plat_err;
                }
        }
 
 machine_err:
        if (platform->driver->compr_ops && platform->driver->compr_ops->free)
                platform->driver->compr_ops->free(cstream);
+plat_err:
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
+               cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
 out:
        fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
        mutex_unlock(&fe->card->mutex);
        if (platform->driver->compr_ops && platform->driver->compr_ops->free)
                platform->driver->compr_ops->free(cstream);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
+               cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
+
        if (cstream->direction == SND_COMPRESS_PLAYBACK) {
                if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
                        snd_soc_dapm_stream_event(rtd,
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_soc_platform *platform = fe->platform;
+       struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        struct snd_soc_dpcm *dpcm;
        int stream, ret;
 
        if (platform->driver->compr_ops && platform->driver->compr_ops->free)
                platform->driver->compr_ops->free(cstream);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
+               cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
+
        mutex_unlock(&fe->card->mutex);
        return 0;
 }
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
                        goto out;
        }
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger)
+               cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
+
+
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
                snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction);
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_soc_platform *platform = fe->platform;
+       struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        int ret = 0, stream;
 
        if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN ||
 
        mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger) {
+               ret = cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
+               if (ret < 0)
+                       goto out;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
                ret = platform->driver->compr_ops->trigger(cstream, cmd);
                if (ret < 0)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
         * expectation is that platform and machine will configure everything
         * for this compress path, like configuring pcm port for codec
         */
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
+               ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
+               if (ret < 0)
+                       goto err;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
                ret = platform->driver->compr_ops->set_params(cstream, params);
                if (ret < 0)
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
        struct snd_soc_platform *platform = fe->platform;
+       struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        int ret = 0, stream;
 
        if (cstream->direction == SND_COMPRESS_PLAYBACK)
 
        mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
+               ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
+               if (ret < 0)
+                       goto out;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
                ret = platform->driver->compr_ops->set_params(cstream, params);
                if (ret < 0)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_params) {
+               ret = cpu_dai->driver->cops->get_params(cstream, params, cpu_dai);
+               if (ret < 0)
+                       goto err;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->get_params)
                ret = platform->driver->compr_ops->get_params(cstream, params);
 
+err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->ack) {
+               ret = cpu_dai->driver->cops->ack(cstream, bytes, cpu_dai);
+               if (ret < 0)
+                       goto err;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->ack)
                ret = platform->driver->compr_ops->ack(cstream, bytes);
 
+err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
        int ret = 0;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
+               cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->pointer)
                ret = platform->driver->compr_ops->pointer(cstream, tstamp);
 
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_metadata) {
+               ret = cpu_dai->driver->cops->set_metadata(cstream, metadata, cpu_dai);
+               if (ret < 0)
+                       return ret;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->set_metadata)
                ret = platform->driver->compr_ops->set_metadata(cstream, metadata);
 
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
        struct snd_soc_platform *platform = rtd->platform;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        int ret = 0;
 
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_metadata) {
+               ret = cpu_dai->driver->cops->get_metadata(cstream, metadata, cpu_dai);
+               if (ret < 0)
+                       return ret;
+       }
+
        if (platform->driver->compr_ops && platform->driver->compr_ops->get_metadata)
                ret = platform->driver->compr_ops->get_metadata(cstream, metadata);