{
        const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
        int ret;
+       int err = 0;
 
        if (spcm->prepared[substream->stream]) {
                /* stop DMA first if needed */
                if (pcm_ops && pcm_ops->platform_stop_during_hw_free)
                        snd_sof_pcm_platform_trigger(sdev, substream, SNDRV_PCM_TRIGGER_STOP);
 
-               /* Send PCM_FREE IPC to reset pipeline */
+               /* free PCM in the DSP */
                if (pcm_ops && pcm_ops->hw_free) {
                        ret = pcm_ops->hw_free(sdev->component, substream);
-                       if (ret < 0)
-                               return ret;
+                       if (ret < 0) {
+                               dev_err(sdev->dev, "%s: pcm_ops hw_free failed %d\n",
+                                       __func__, ret);
+                               err = ret;
+                       }
                }
 
                spcm->prepared[substream->stream] = false;
 
        /* reset the DMA */
        ret = snd_sof_pcm_platform_hw_free(sdev, substream);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               dev_err(sdev->dev, "%s: platform hw free failed %d\n",
+                       __func__, ret);
+               if (!err)
+                       err = ret;
+       }
 
        /* free widget list */
        if (free_widget_list) {
                ret = sof_widget_list_free(sdev, spcm, dir);
-               if (ret < 0)
-                       dev_err(sdev->dev, "failed to free widgets during suspend\n");
+               if (ret < 0) {
+                       dev_err(sdev->dev, "%s: sof_widget_list_free failed %d\n",
+                               __func__, ret);
+                       if (!err)
+                               err = ret;
+               }
        }
 
-       return ret;
+       return err;
 }
 
 /*