return 0;
 }
 
+static void wm_adsp_buffer_clear(struct wm_adsp_compr_buf *buf)
+{
+       buf->irq_count = 0xFFFFFFFF;
+       buf->read_index = -1;
+       buf->avail = 0;
+}
+
 static int wm_adsp_buffer_init(struct wm_adsp *dsp)
 {
        struct wm_adsp_compr_buf *buf;
                return -ENOMEM;
 
        buf->dsp = dsp;
-       buf->read_index = -1;
-       buf->irq_count = 0xFFFFFFFF;
+
+       wm_adsp_buffer_clear(buf);
 
        ret = wm_adsp_buffer_locate(buf);
        if (ret < 0) {
 
        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;
+               if (!wm_adsp_compr_attached(compr)) {
+                       ret = wm_adsp_compr_attach(compr);
+                       if (ret < 0) {
+                               adsp_err(dsp, "Failed to link buffer and stream: %d\n",
+                                        ret);
+                               break;
+                       }
                }
 
+               wm_adsp_buffer_clear(compr->buf);
+
                /* Trigger the IRQ at one fragment of data */
                ret = wm_adsp_buffer_write(compr->buf,
                                           HOST_BUFFER_FIELD(high_water_mark),