Commit 555f8a80 authored by Liam Girdwood's avatar Liam Girdwood Committed by Mark Brown

ASoC: Intel: Add support to unload/reload firmware modules.

Add some SST API calls to unload and reload firmware modules. This can be used
by PM code to restore state and also allow modular FW to unload and release
memory blocks.
Signed-off-by: default avatarLiam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent dd1b94bf
...@@ -283,6 +283,8 @@ struct sst_fw *sst_fw_new(struct sst_dsp *dsp, ...@@ -283,6 +283,8 @@ struct sst_fw *sst_fw_new(struct sst_dsp *dsp,
const struct firmware *fw, void *private); const struct firmware *fw, void *private);
void sst_fw_free(struct sst_fw *sst_fw); void sst_fw_free(struct sst_fw *sst_fw);
void sst_fw_free_all(struct sst_dsp *dsp); void sst_fw_free_all(struct sst_dsp *dsp);
int sst_fw_reload(struct sst_fw *sst_fw);
void sst_fw_unload(struct sst_fw *sst_fw);
/* Create/Free firmware modules */ /* Create/Free firmware modules */
struct sst_module *sst_module_new(struct sst_fw *sst_fw, struct sst_module *sst_module_new(struct sst_fw *sst_fw,
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#include "sst-dsp.h" #include "sst-dsp.h"
#include "sst-dsp-priv.h" #include "sst-dsp-priv.h"
static void block_module_remove(struct sst_module *module);
static void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes) static void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
{ {
u32 i; u32 i;
...@@ -97,6 +99,42 @@ struct sst_fw *sst_fw_new(struct sst_dsp *dsp, ...@@ -97,6 +99,42 @@ struct sst_fw *sst_fw_new(struct sst_dsp *dsp,
} }
EXPORT_SYMBOL_GPL(sst_fw_new); EXPORT_SYMBOL_GPL(sst_fw_new);
int sst_fw_reload(struct sst_fw *sst_fw)
{
struct sst_dsp *dsp = sst_fw->dsp;
int ret;
dev_dbg(dsp->dev, "reloading firmware\n");
/* call core specific FW paser to load FW data into DSP */
ret = dsp->ops->parse_fw(sst_fw);
if (ret < 0)
dev_err(dsp->dev, "error: parse fw failed %d\n", ret);
return ret;
}
EXPORT_SYMBOL_GPL(sst_fw_reload);
void sst_fw_unload(struct sst_fw *sst_fw)
{
struct sst_dsp *dsp = sst_fw->dsp;
struct sst_module *module, *tmp;
dev_dbg(dsp->dev, "unloading firmware\n");
mutex_lock(&dsp->mutex);
list_for_each_entry_safe(module, tmp, &dsp->module_list, list) {
if (module->sst_fw == sst_fw) {
block_module_remove(module);
list_del(&module->list);
kfree(module);
}
}
mutex_unlock(&dsp->mutex);
}
EXPORT_SYMBOL_GPL(sst_fw_unload);
/* free single firmware object */ /* free single firmware object */
void sst_fw_free(struct sst_fw *sst_fw) void sst_fw_free(struct sst_fw *sst_fw)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment