cancel_work_sync(&sdev->probe_work);
 
        if (sdev->fw_state > SOF_FW_BOOT_NOT_STARTED) {
+               snd_sof_free_trace(sdev);
                ret = snd_sof_dsp_power_down_notify(sdev);
                if (ret < 0)
                        dev_warn(dev, "error: %d failed to prepare DSP for device removal",
 
                snd_sof_ipc_free(sdev);
                snd_sof_free_debug(sdev);
-               snd_sof_free_trace(sdev);
        }
 
        /*
 
 
 void snd_sof_release_trace(struct snd_sof_dev *sdev)
 {
+       struct sof_ipc_fw_ready *ready = &sdev->fw_ready;
+       struct sof_ipc_fw_version *v = &ready->version;
+       struct sof_ipc_cmd_hdr hdr;
+       struct sof_ipc_reply ipc_reply;
        int ret;
 
        if (!sdev->dtrace_is_supported || !sdev->dtrace_is_enabled)
                dev_err(sdev->dev,
                        "error: snd_sof_dma_trace_trigger: stop: %d\n", ret);
 
+       /*
+        * stop and free trace DMA in the DSP. TRACE_DMA_FREE is only supported from
+        * ABI 3.20.0 onwards
+        */
+       if (v->abi_version >= SOF_ABI_VER(3, 20, 0)) {
+               hdr.size = sizeof(hdr);
+               hdr.cmd = SOF_IPC_GLB_TRACE_MSG | SOF_IPC_TRACE_DMA_FREE;
+
+               ret = sof_ipc_tx_message(sdev->ipc, hdr.cmd, &hdr, hdr.size,
+                                        &ipc_reply, sizeof(ipc_reply));
+               if (ret < 0)
+                       dev_err(sdev->dev, "DMA_TRACE_FREE failed with error: %d\n", ret);
+       }
+
        ret = snd_sof_dma_trace_release(sdev);
        if (ret < 0)
                dev_err(sdev->dev,