sst: avoid unnecessary firmware reloading for MRST
SST HW on MRST doesn't need to reload the firmware during suspend/resume cycle, so remove the extra workload. This also fix a bug that the firmware sample rate can't be modified when there is no active playback/capture stream. Signed-off-by: Feng Tang <feng.tang@intel.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
35b5ddb646
commit
26af13f15a
|
@ -545,7 +545,10 @@ static int intel_sst_runtime_suspend(struct device *dev)
|
|||
/* Move the SST state to Suspended */
|
||||
mutex_lock(&sst_drv_ctx->sst_lock);
|
||||
sst_drv_ctx->sst_state = SST_SUSPENDED;
|
||||
sst_shim_write(sst_drv_ctx->shim, SST_CSR, csr.full);
|
||||
|
||||
/* Only needed by Medfield */
|
||||
if (sst_drv_ctx->pci_id != SST_MRST_PCI_ID)
|
||||
sst_shim_write(sst_drv_ctx->shim, SST_CSR, csr.full);
|
||||
mutex_unlock(&sst_drv_ctx->sst_lock);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -420,6 +420,8 @@ struct intel_sst_drv {
|
|||
unsigned int max_streams;
|
||||
unsigned int *fw_cntx;
|
||||
unsigned int fw_cntx_size;
|
||||
|
||||
unsigned int fw_downloaded;
|
||||
};
|
||||
|
||||
extern struct intel_sst_drv *sst_drv_ctx;
|
||||
|
|
|
@ -53,6 +53,13 @@ int sst_download_fw(void)
|
|||
if (sst_drv_ctx->sst_state != SST_UN_INIT)
|
||||
return -EPERM;
|
||||
|
||||
/* Reload firmware is not needed for MRST */
|
||||
if ( (sst_drv_ctx->pci_id == SST_MRST_PCI_ID) && sst_drv_ctx->fw_downloaded) {
|
||||
pr_debug("FW already downloaded, skip for MRST platform\n");
|
||||
sst_drv_ctx->sst_state = SST_FW_RUNNING;
|
||||
return 0;
|
||||
}
|
||||
|
||||
snprintf(name, sizeof(name), "%s%04x%s", "fw_sst_",
|
||||
sst_drv_ctx->pci_id, ".bin");
|
||||
|
||||
|
@ -71,6 +78,9 @@ int sst_download_fw(void)
|
|||
retval = sst_wait_timeout(sst_drv_ctx, &sst_drv_ctx->alloc_block[0]);
|
||||
if (retval)
|
||||
pr_err("fw download failed %d\n" , retval);
|
||||
else
|
||||
sst_drv_ctx->fw_downloaded = 1;
|
||||
|
||||
end_restore:
|
||||
release_firmware(fw_sst);
|
||||
sst_drv_ctx->alloc_block[0].sst_id = BLOCK_UNINIT;
|
||||
|
|
Loading…
Reference in a new issue