mirror of https://gitee.com/openkylin/linux.git
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 */
|
/* Move the SST state to Suspended */
|
||||||
mutex_lock(&sst_drv_ctx->sst_lock);
|
mutex_lock(&sst_drv_ctx->sst_lock);
|
||||||
sst_drv_ctx->sst_state = SST_SUSPENDED;
|
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);
|
mutex_unlock(&sst_drv_ctx->sst_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,6 +420,8 @@ struct intel_sst_drv {
|
||||||
unsigned int max_streams;
|
unsigned int max_streams;
|
||||||
unsigned int *fw_cntx;
|
unsigned int *fw_cntx;
|
||||||
unsigned int fw_cntx_size;
|
unsigned int fw_cntx_size;
|
||||||
|
|
||||||
|
unsigned int fw_downloaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct intel_sst_drv *sst_drv_ctx;
|
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)
|
if (sst_drv_ctx->sst_state != SST_UN_INIT)
|
||||||
return -EPERM;
|
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_",
|
snprintf(name, sizeof(name), "%s%04x%s", "fw_sst_",
|
||||||
sst_drv_ctx->pci_id, ".bin");
|
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]);
|
retval = sst_wait_timeout(sst_drv_ctx, &sst_drv_ctx->alloc_block[0]);
|
||||||
if (retval)
|
if (retval)
|
||||||
pr_err("fw download failed %d\n" , retval);
|
pr_err("fw download failed %d\n" , retval);
|
||||||
|
else
|
||||||
|
sst_drv_ctx->fw_downloaded = 1;
|
||||||
|
|
||||||
end_restore:
|
end_restore:
|
||||||
release_firmware(fw_sst);
|
release_firmware(fw_sst);
|
||||||
sst_drv_ctx->alloc_block[0].sst_id = BLOCK_UNINIT;
|
sst_drv_ctx->alloc_block[0].sst_id = BLOCK_UNINIT;
|
||||||
|
|
Loading…
Reference in New Issue