aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/intel/sst-firmware.c
diff options
context:
space:
mode:
authorLiam Girdwood <liam.r.girdwood@linux.intel.com>2014-05-05 12:31:37 -0400
committerMark Brown <broonie@linaro.org>2014-05-08 13:20:58 -0400
commit555f8a80c397b1a6ffccb294525df6ca2d721585 (patch)
tree121d1aacce9c327456e00d0bd80ce7c03ad79c75 /sound/soc/intel/sst-firmware.c
parentdd1b94bf4920cc12545883faa43c014efbf61b1e (diff)
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: Liam Girdwood <liam.r.girdwood@linux.intel.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/intel/sst-firmware.c')
-rw-r--r--sound/soc/intel/sst-firmware.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/sound/soc/intel/sst-firmware.c b/sound/soc/intel/sst-firmware.c
index f24619adc3d1..0c74bf1d2021 100644
--- a/sound/soc/intel/sst-firmware.c
+++ b/sound/soc/intel/sst-firmware.c
@@ -30,6 +30,8 @@
30#include "sst-dsp.h" 30#include "sst-dsp.h"
31#include "sst-dsp-priv.h" 31#include "sst-dsp-priv.h"
32 32
33static void block_module_remove(struct sst_module *module);
34
33static void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes) 35static void sst_memcpy32(volatile void __iomem *dest, void *src, u32 bytes)
34{ 36{
35 u32 i; 37 u32 i;
@@ -97,6 +99,42 @@ parse_err:
97} 99}
98EXPORT_SYMBOL_GPL(sst_fw_new); 100EXPORT_SYMBOL_GPL(sst_fw_new);
99 101
102int sst_fw_reload(struct sst_fw *sst_fw)
103{
104 struct sst_dsp *dsp = sst_fw->dsp;
105 int ret;
106
107 dev_dbg(dsp->dev, "reloading firmware\n");
108
109 /* call core specific FW paser to load FW data into DSP */
110 ret = dsp->ops->parse_fw(sst_fw);
111 if (ret < 0)
112 dev_err(dsp->dev, "error: parse fw failed %d\n", ret);
113
114 return ret;
115}
116EXPORT_SYMBOL_GPL(sst_fw_reload);
117
118void sst_fw_unload(struct sst_fw *sst_fw)
119{
120 struct sst_dsp *dsp = sst_fw->dsp;
121 struct sst_module *module, *tmp;
122
123 dev_dbg(dsp->dev, "unloading firmware\n");
124
125 mutex_lock(&dsp->mutex);
126 list_for_each_entry_safe(module, tmp, &dsp->module_list, list) {
127 if (module->sst_fw == sst_fw) {
128 block_module_remove(module);
129 list_del(&module->list);
130 kfree(module);
131 }
132 }
133
134 mutex_unlock(&dsp->mutex);
135}
136EXPORT_SYMBOL_GPL(sst_fw_unload);
137
100/* free single firmware object */ 138/* free single firmware object */
101void sst_fw_free(struct sst_fw *sst_fw) 139void sst_fw_free(struct sst_fw *sst_fw)
102{ 140{