ASoC: fsl_audmix: Add spin lock to protect tdms
When two stream start to run, the trigger function may be called by two substream in same time, that the priv->tdms may be updated wrongly Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>5.4-rM2-2.2.x-imx-squashed
parent
219d54332a
commit
9360612b85
|
@ -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;
|
||||
|
|
|
@ -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