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:
Feng Tang 2011-07-08 09:59:26 +01:00 committed by Greg Kroah-Hartman
parent 35b5ddb646
commit 26af13f15a
3 changed files with 16 additions and 1 deletions

View File

@ -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;
} }

View File

@ -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;

View File

@ -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;