.free = wm_adsp_compr_free,
        .set_params = wm_adsp_compr_set_params,
        .get_caps = wm_adsp_compr_get_caps,
+       .trigger = wm_adsp_compr_trigger,
 };
 
 static struct snd_soc_platform_driver wm5110_compr_platform = {
 
 
 struct wm_adsp_compr {
        struct wm_adsp *dsp;
+       struct wm_adsp_compr_buf *buf;
 
        struct snd_compr_stream *stream;
        struct snd_compressed_buffer size;
                goto out;
        }
 
+       if (dsp->compr) {
+               /* It is expect this limitation will be removed in future */
+               adsp_err(dsp, "Only a single stream supported per DSP\n");
+               ret = -EBUSY;
+               goto out;
+       }
+
        compr = kzalloc(sizeof(*compr), GFP_KERNEL);
        if (!compr) {
                ret = -ENOMEM;
        return 0;
 }
 
+static inline int wm_adsp_compr_attached(struct wm_adsp_compr *compr)
+{
+       return compr->buf != NULL;
+}
+
+static int wm_adsp_compr_attach(struct wm_adsp_compr *compr)
+{
+       /*
+        * Note this will be more complex once each DSP can support multiple
+        * streams
+        */
+       if (!compr->dsp->buffer)
+               return -EINVAL;
+
+       compr->buf = compr->dsp->buffer;
+
+       return 0;
+}
+
+int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd)
+{
+       struct wm_adsp_compr *compr = stream->runtime->private_data;
+       struct wm_adsp *dsp = compr->dsp;
+       int ret = 0;
+
+       adsp_dbg(dsp, "Trigger: %d\n", cmd);
+
+       mutex_lock(&dsp->pwr_lock);
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+               if (wm_adsp_compr_attached(compr))
+                       break;
+
+               ret = wm_adsp_compr_attach(compr);
+               if (ret < 0) {
+                       adsp_err(dsp, "Failed to link buffer and stream: %d\n",
+                                ret);
+                       break;
+               }
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+               break;
+       default:
+               ret = -EINVAL;
+               break;
+       }
+
+       mutex_unlock(&dsp->pwr_lock);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger);
+
 MODULE_LICENSE("GPL v2");