summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_dsp.c
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/fsl/fsl_dsp.c
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/fsl/fsl_dsp.c')
-rw-r--r--sound/soc/fsl/fsl_dsp.c12
1 files changed, 8 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. */