summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/fsl/fsl_dsp.c12
-rw-r--r--sound/soc/fsl/fsl_dsp_proxy.h1
2 files changed, 9 insertions, 4 deletions
diff --git a/sound/soc/fsl/fsl_dsp.c b/sound/soc/fsl/fsl_dsp.c
index ef30b5a30bd2..c849f0832b3d 100644
--- a/sound/soc/fsl/fsl_dsp.c
+++ b/sound/soc/fsl/fsl_dsp.c
@@ -369,6 +369,7 @@ int fsl_dsp_open_func(struct fsl_dsp *dsp_priv, struct xf_client *client)
atomic_set(&client->vm_use, 0);
client->global = (void *)dsp_priv;
+ dsp_priv->proxy.is_loaded = 0;
pm_runtime_get_sync(dev);
@@ -688,10 +689,12 @@ static void dsp_load_firmware(const struct firmware *fw, void *context)
(!strcmp(&strtab[shdr->sh_name], ".data")) ||
(!strcmp(&strtab[shdr->sh_name], ".bss"))
) {
- memcpy_dsp((void *)(dsp_priv->sdram_vir_addr
- + (sh_addr - dsp_priv->sdram_phys_addr)),
- (const void *)image,
- shdr->sh_size);
+ if (!dsp_priv->proxy.is_loaded) {
+ memcpy_dsp((void *)(dsp_priv->sdram_vir_addr
+ + (sh_addr - dsp_priv->sdram_phys_addr)),
+ (const void *)image,
+ shdr->sh_size);
+ }
} else {
/* sh_addr is from DSP view, we need to
* fixup addr because we load the firmware from
@@ -710,6 +713,7 @@ static void dsp_load_firmware(const struct firmware *fw, void *context)
/* start the core */
imx_sc_pm_cpu_start(dsp_priv->dsp_ipcHandle,
IMX_SC_R_DSP, true, dsp_priv->iram);
+ dsp_priv->proxy.is_loaded = 1;
}
/* Initialization of the MU code. */
diff --git a/sound/soc/fsl/fsl_dsp_proxy.h b/sound/soc/fsl/fsl_dsp_proxy.h
index fabcf768fb88..8df703efea63 100644
--- a/sound/soc/fsl/fsl_dsp_proxy.h
+++ b/sound/soc/fsl/fsl_dsp_proxy.h
@@ -299,6 +299,7 @@ struct xf_proxy {
struct completion cmd_complete;
int is_ready;
+ int is_loaded;
/* ...internal lock */
spinlock_t lock;