@@ -45,7 +45,7 @@ static unsigned int bxt_get_errorcode(struct sst_dsp *ctx)
return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE);
}
-static int
+int
bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
{
struct snd_dma_buffer dmab;
@@ -88,6 +88,7 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo, int lib_count)
skl_release_library(linfo, lib_count);
return ret;
}
+EXPORT_SYMBOL_GPL(bxt_load_library);
/*
* First boot sequence has some extra steps. Core 0 waits for power
@@ -179,6 +179,16 @@ static int cnl_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id)
return ret;
}
+ if (cnl->lib_count > 1) {
+ ret = ctx->fw_ops.load_library(ctx, cnl->lib_info,
+ cnl->lib_count);
+ if (ret < 0) {
+ dev_err(ctx->dev,
+ "reload libs failed: %d\n", ret);
+ return ret;
+ }
+ }
+
cnl->cores.state[core_id] = SKL_DSP_RUNNING;
return ret;
}
@@ -273,6 +283,7 @@ static const struct skl_dsp_fw_ops cnl_fw_ops = {
.set_state_D3 = cnl_set_dsp_D3,
.load_fw = cnl_load_base_firmware,
.get_fw_errcode = cnl_get_errno,
+ .load_library = bxt_load_library,
};
static struct sst_ops cnl_ops = {
@@ -228,6 +228,8 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
struct skl_dev **dsp);
void skl_sst_dsp_cleanup(struct device *dev, struct skl_dev *skl);
void bxt_sst_dsp_cleanup(struct device *dev, struct skl_dev *skl);
+int bxt_load_library(struct sst_dsp *ctx, struct skl_lib_info *linfo,
+ int lib_count);
int snd_skl_parse_uuids(struct sst_dsp *ctx, const struct firmware *fw,
unsigned int offset, int index);
As libraries are lost in D3, they need to be reloaded on D0 entry. Cannonlake's library load process is equivalent to Broxton's, thus reuse the existing one. Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> --- sound/soc/intel/skylake/bxt-sst.c | 3 ++- sound/soc/intel/skylake/cnl-sst.c | 11 +++++++++++ sound/soc/intel/skylake/skl-sst-dsp.h | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-)