ret = ctx->fw_ops.set_state_D0(ctx, core_id);
                if (ret < 0) {
                        dev_err(ctx->dev, "unable to get core%d\n", core_id);
-                       return ret;
+                       goto out;
                }
        }
 
        skl->cores.usage_count[core_id]++;
 
+out:
        dev_dbg(ctx->dev, "core id %d state %d usage_count %d\n",
                        core_id, skl->cores.state[core_id],
                        skl->cores.usage_count[core_id]);
                return -EINVAL;
        }
 
-       if (--skl->cores.usage_count[core_id] == 0) {
+       if ((--skl->cores.usage_count[core_id] == 0) &&
+               (skl->cores.state[core_id] != SKL_DSP_RESET)) {
                ret = ctx->fw_ops.set_state_D3(ctx, core_id);
                if (ret < 0) {
                        dev_err(ctx->dev, "unable to put core %d: %d\n",