ASoC: fsl_audmix: Add spin lock to protect tdms
commit5.4-rM2-2.2.x-imx-squashedfe965096c9
upstream. Audmix support two substream, When two substream start to run, the trigger function may be called by two substream in same time, that the priv->tdms may be updated wrongly. The expected priv->tdms is 0x3, but sometimes the result is 0x2, or 0x1. Fixes:be1df61cf0
("ASoC: fsl: Add Audio Mixer CPU DAI driver") Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Acked-by: Nicolin Chen <nicoleotsuka@gmail.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Link: https://lore.kernel.org/r/1e706afe53fdd1fbbbc79277c48a98f8416ba873.1573458378.git.shengjiu.wang@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org> Cc: <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
9ae0611f0c
commit
a11fab7708
|
@ -286,6 +286,7 @@ static int fsl_audmix_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
struct snd_soc_dai *dai)
|
||||
{
|
||||
struct fsl_audmix *priv = snd_soc_dai_get_drvdata(dai);
|
||||
unsigned long lock_flags;
|
||||
|
||||
/* Capture stream shall not be handled */
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
|
||||
|
@ -295,12 +296,16 @@ static int fsl_audmix_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
spin_lock_irqsave(&priv->lock, lock_flags);
|
||||
priv->tdms |= BIT(dai->driver->id);
|
||||
spin_unlock_irqrestore(&priv->lock, lock_flags);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
spin_lock_irqsave(&priv->lock, lock_flags);
|
||||
priv->tdms &= ~BIT(dai->driver->id);
|
||||
spin_unlock_irqrestore(&priv->lock, lock_flags);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -491,6 +496,7 @@ static int fsl_audmix_probe(struct platform_device *pdev)
|
|||
return PTR_ERR(priv->ipg_clk);
|
||||
}
|
||||
|
||||
spin_lock_init(&priv->lock);
|
||||
platform_set_drvdata(pdev, priv);
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
|
|
|
@ -96,6 +96,7 @@ struct fsl_audmix {
|
|||
struct platform_device *pdev;
|
||||
struct regmap *regmap;
|
||||
struct clk *ipg_clk;
|
||||
spinlock_t lock; /* Protect tdms */
|
||||
u8 tdms;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue