Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26af13f1 authored by Feng Tang's avatar Feng Tang Committed by Greg Kroah-Hartman
Browse files

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: default avatarFeng Tang <feng.tang@intel.com>
Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 35b5ddb6
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -545,6 +545,9 @@ 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;

	/* 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;
+2 −0
Original line number Diff line number Diff line
@@ -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;
+10 −0
Original line number Diff line number Diff line
@@ -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;