summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorDaniel Baluta <daniel.baluta@nxp.com>2018-10-03 16:45:57 +0300
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:52:03 +0800
commiteae3b2f34cd1a7a0301a8fe087a5a02b8a226859 (patch)
tree45f39eaf1dc69c3ca1c5a67dabfdb11e9e1016eb /sound/soc
parentee01b4da5e9a77ed540113bac8711b7de5e14bde (diff)
MLK-18497-13: ASoC: fsl: dsp: Skip SDRAM section update if fw is already loaded
If the DSP firmware binary is already loaded it is wrong to update SDRAM located sections because we will overwrite and data stored there. This makes suspend/resume work. Reviewed-by: Cosmin-Gabriel Samoila <cosmin.samoila@nxp.com> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com>
Diffstat (limited to 'sound/soc')
-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;