ASoC: mxs-saif: Store saif state
Trigger commands may be passed multiple times. To avoid errors with clk_enable/disable, store the saif state and return if saif is already running/stopped. Signed-off-by: Markus Pargmann <mpa@pengutronix.de> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
Родитель
9f1614aae5
Коммит
88cf632a13
|
@ -503,6 +503,9 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
case SNDRV_PCM_TRIGGER_START:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
if (saif->state == MXS_SAIF_STATE_RUNNING)
|
||||
return 0;
|
||||
|
||||
dev_dbg(cpu_dai->dev, "start\n");
|
||||
|
||||
clk_enable(master_saif->clk);
|
||||
|
@ -543,6 +546,7 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
}
|
||||
|
||||
master_saif->ongoing = 1;
|
||||
saif->state = MXS_SAIF_STATE_RUNNING;
|
||||
|
||||
dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n",
|
||||
__raw_readl(saif->base + SAIF_CTRL),
|
||||
|
@ -555,6 +559,9 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
if (saif->state == MXS_SAIF_STATE_STOPPED)
|
||||
return 0;
|
||||
|
||||
dev_dbg(cpu_dai->dev, "stop\n");
|
||||
|
||||
/* wait a while for the current sample to complete */
|
||||
|
@ -575,6 +582,7 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
}
|
||||
|
||||
master_saif->ongoing = 0;
|
||||
saif->state = MXS_SAIF_STATE_STOPPED;
|
||||
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -124,6 +124,11 @@ struct mxs_saif {
|
|||
|
||||
u32 fifo_underrun;
|
||||
u32 fifo_overrun;
|
||||
|
||||
enum {
|
||||
MXS_SAIF_STATE_STOPPED,
|
||||
MXS_SAIF_STATE_RUNNING,
|
||||
} state;
|
||||
};
|
||||
|
||||
extern int mxs_saif_put_mclk(unsigned int saif_id);
|
||||
|
|
Загрузка…
Ссылка в новой задаче