summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>2019-05-24 14:09:21 -0500
committerMark Brown <broonie@kernel.org>2019-05-28 15:48:05 +0100
commitfab4edf42d2d68d0aa67822650174dcd0ee25ffa (patch)
tree1e57c33d9913cef525dd6c53a369f24e54d99c17 /sound
parent04ea642ff62a2b2da3d5844283991a41328f49b1 (diff)
downloadlinux-stable-fab4edf42d2d68d0aa67822650174dcd0ee25ffa.tar.gz
linux-stable-fab4edf42d2d68d0aa67822650174dcd0ee25ffa.tar.bz2
linux-stable-fab4edf42d2d68d0aa67822650174dcd0ee25ffa.zip
ASoC: SOF: pcm: remove warning - initialize workqueue on open
If the SOF hw_params() fail, typically with an IPC error thrown by the firmware, the period_elapsed workqueue is not initialized, but we still cancel it in hw_free(), which results in a kernel warning. Move the initialization to the .open callback. Tested on Broadwell (Samus) and IceLake. Fixes: e2803e610ae ("ASoC: SOF: PCM: add period_elapsed work to fix race condition in interrupt context") GitHub issue: https://github.com/thesofproject/linux/issues/932 Reviewed-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/sof/pcm.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c
index d6dc9a7df0f4..dace6c4cd91e 100644
--- a/sound/soc/sof/pcm.c
+++ b/sound/soc/sof/pcm.c
@@ -211,9 +211,6 @@ static int sof_pcm_hw_params(struct snd_pcm_substream *substream,
/* save pcm hw_params */
memcpy(&spcm->params[substream->stream], params, sizeof(*params));
- INIT_WORK(&spcm->stream[substream->stream].period_elapsed_work,
- sof_pcm_period_elapsed_work);
-
/* clear hw_params_upon_resume flag */
spcm->hw_params_upon_resume[substream->stream] = 0;
@@ -432,6 +429,9 @@ static int sof_pcm_open(struct snd_pcm_substream *substream)
dev_dbg(sdev->dev, "pcm: open stream %d dir %d\n", spcm->pcm.pcm_id,
substream->stream);
+ INIT_WORK(&spcm->stream[substream->stream].period_elapsed_work,
+ sof_pcm_period_elapsed_work);
+
caps = &spcm->pcm.caps[substream->stream];
ret = pm_runtime_get_sync(sdev->dev);