forked from luck/tmp_suning_uos_patched
ASoC: sti: Fix deadlock via snd_pcm_stop_xrun() call
commit 455c5653f50e10b4f460ef24e99f0044fbe3401c upstream. This is essentially a revert of the commitdc865fb9e7
("ASoC: sti: Use snd_pcm_stop_xrun() helper"), which converted the manual snd_pcm_stop() calls with snd_pcm_stop_xrun(). The commit above introduced a deadlock as snd_pcm_stop_xrun() itself takes the PCM stream lock while the caller already holds it. Since the conversion was done only for consistency reason and the open-call with snd_pcm_stop() to the XRUN state is a correct usage, let's revert the commit back as the fix. Fixes:dc865fb9e7
("ASoC: sti: Use snd_pcm_stop_xrun() helper") Reported-by: Daniel Palmer <daniel@0x0f.com> Cc: Arnaud POULIQUEN <arnaud.pouliquen@st.com> Cc: <stable@vger.kernel.org> Link: https://lore.kernel.org/r/20220315091319.3351522-1-daniel@0x0f.com Signed-off-by: Takashi Iwai <tiwai@suse.de> Reviewed-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> Link: https://lore.kernel.org/r/20220315164158.19804-1-tiwai@suse.de Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
571df3393f
commit
db03abd0da
|
@ -91,7 +91,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
|
|||
SET_UNIPERIF_ITM_BCLR_FIFO_ERROR(player);
|
||||
|
||||
/* Stop the player */
|
||||
snd_pcm_stop_xrun(player->substream);
|
||||
snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
|
||||
}
|
||||
|
||||
ret = IRQ_HANDLED;
|
||||
|
@ -105,7 +105,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
|
|||
SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player);
|
||||
|
||||
/* Stop the player */
|
||||
snd_pcm_stop_xrun(player->substream);
|
||||
snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
|
||||
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
|
|||
dev_err(player->dev, "Underflow recovery failed\n");
|
||||
|
||||
/* Stop the player */
|
||||
snd_pcm_stop_xrun(player->substream);
|
||||
snd_pcm_stop(player->substream, SNDRV_PCM_STATE_XRUN);
|
||||
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ static irqreturn_t uni_reader_irq_handler(int irq, void *dev_id)
|
|||
if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(reader))) {
|
||||
dev_err(reader->dev, "FIFO error detected\n");
|
||||
|
||||
snd_pcm_stop_xrun(reader->substream);
|
||||
snd_pcm_stop(reader->substream, SNDRV_PCM_STATE_XRUN);
|
||||
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user