if (mconfig->id.pvt_id < 0)
                        return ret;
                skl_tplg_set_module_init_data(w);
+
+               ret = skl_dsp_get_core(ctx->dsp, mconfig->core_id);
+               if (ret < 0) {
+                       dev_err(ctx->dev, "Failed to wake up core %d ret=%d\n",
+                                               mconfig->core_id, ret);
+                       return ret;
+               }
+
                ret = skl_init_module(ctx, mconfig);
                if (ret < 0) {
                        skl_put_pvt_id(ctx, uuid_mod, &mconfig->id.pvt_id);
-                       return ret;
+                       goto err;
                }
                skl_tplg_alloc_pipe_mcps(skl, mconfig);
                ret = skl_tplg_set_module_params(w, ctx);
                if (ret < 0)
-                       return ret;
+                       goto err;
        }
 
        return 0;
+err:
+       skl_dsp_put_core(ctx->dsp, mconfig->core_id);
+       return ret;
 }
 
 static int skl_tplg_unload_pipe_modules(struct skl_sst *ctx,
         struct skl_pipe *pipe)
 {
-       int ret;
+       int ret = 0;
        struct skl_pipe_module *w_module = NULL;
        struct skl_module_cfg *mconfig = NULL;
 
                                return -EIO;
                }
                skl_put_pvt_id(ctx, uuid_mod, &mconfig->id.pvt_id);
+
+               ret = skl_dsp_put_core(ctx->dsp, mconfig->core_id);
+               if (ret < 0) {
+                       /* don't return; continue with other modules */
+                       dev_err(ctx->dev, "Failed to sleep core %d ret=%d\n",
+                               mconfig->core_id, ret);
+               }
        }
 
        /* no modules to unload in this path, so return */
-       return 0;
+       return ret;
 }
 
 /*