diff mbox

ASoC: Intel: Fix block is enabled multiple times issue

Message ID 1413947278-3458-1-git-send-email-yang.jie@intel.com (mailing list archive)
State Accepted
Commit 35c0a8c0178ad3f6f14e1dd76f0317156deaae51
Headers show

Commit Message

Jie, Yang Oct. 22, 2014, 3:07 a.m. UTC
During FW parsing and loading, block_list_prepare() may
be called for each raw data block copying and this may
made the hsw_block_enable() called mutiple times, which
increase block->users many times. The result of this is
hsw_block_disable() can't power gated the related block
when trying to free the blocks during suspend, and the
power gating status also confused.

Here check the block user status, only calling enable()
for those blocks who has no user yet. Remember that
this works correctlly on current case, where there are
enough SRAM memory so different module won't share a
memory block. For further usage, we may need restructure
the struct sst_mem_block to save the module list who is
using it.

Signed-off-by: Jie Yang <yang.jie@intel.com>
---
 sound/soc/intel/sst-firmware.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Mark Brown Oct. 22, 2014, 9:26 a.m. UTC | #1
On Wed, Oct 22, 2014 at 11:07:58AM +0800, Jie Yang wrote:
> During FW parsing and loading, block_list_prepare() may
> be called for each raw data block copying and this may
> made the hsw_block_enable() called mutiple times, which
> increase block->users many times. The result of this is
> hsw_block_disable() can't power gated the related block
> when trying to free the blocks during suspend, and the
> power gating status also confused.

This doesn't apply against either fix/intel or topic/intel, please
check and resend.
diff mbox

Patch

diff --git a/sound/soc/intel/sst-firmware.c b/sound/soc/intel/sst-firmware.c
index f2f1d5f..db60398 100644
--- a/sound/soc/intel/sst-firmware.c
+++ b/sound/soc/intel/sst-firmware.c
@@ -80,7 +80,7 @@  static int block_list_prepare(struct sst_dsp *dsp,
 	/* enable each block so that's it'e ready for data */
 	list_for_each_entry(block, block_list, module_list) {
 
-		if (block->ops && block->ops->enable) {
+		if (block->ops && block->ops->enable && !block->users) {
 			ret = block->ops->enable(block);
 			if (ret < 0) {
 				dev_err(dsp->dev,