diff options
author | Markus Pargmann <mpa@pengutronix.de> | 2013-10-11 06:11:03 -0400 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-10-14 13:01:50 -0400 |
commit | 88cf632a135188db35b4db412a06b155fa444eb1 (patch) | |
tree | d08df40ce6ac0261ef7f5ab2205e7ee98435cae9 | |
parent | 9f1614aae59033b79941220f65ad36f5fe54a579 (diff) |
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>
-rw-r--r-- | sound/soc/mxs/mxs-saif.c | 8 | ||||
-rw-r--r-- | sound/soc/mxs/mxs-saif.h | 5 |
2 files changed, 13 insertions, 0 deletions
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c index b56b8a0e8deb..c8ead011c95b 100644 --- a/sound/soc/mxs/mxs-saif.c +++ b/sound/soc/mxs/mxs-saif.c | |||
@@ -503,6 +503,9 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd, | |||
503 | case SNDRV_PCM_TRIGGER_START: | 503 | case SNDRV_PCM_TRIGGER_START: |
504 | case SNDRV_PCM_TRIGGER_RESUME: | 504 | case SNDRV_PCM_TRIGGER_RESUME: |
505 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 505 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
506 | if (saif->state == MXS_SAIF_STATE_RUNNING) | ||
507 | return 0; | ||
508 | |||
506 | dev_dbg(cpu_dai->dev, "start\n"); | 509 | dev_dbg(cpu_dai->dev, "start\n"); |
507 | 510 | ||
508 | clk_enable(master_saif->clk); | 511 | clk_enable(master_saif->clk); |
@@ -543,6 +546,7 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd, | |||
543 | } | 546 | } |
544 | 547 | ||
545 | master_saif->ongoing = 1; | 548 | master_saif->ongoing = 1; |
549 | saif->state = MXS_SAIF_STATE_RUNNING; | ||
546 | 550 | ||
547 | dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n", | 551 | dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n", |
548 | __raw_readl(saif->base + SAIF_CTRL), | 552 | __raw_readl(saif->base + SAIF_CTRL), |
@@ -555,6 +559,9 @@ static int mxs_saif_trigger(struct snd_pcm_substream *substream, int cmd, | |||
555 | case SNDRV_PCM_TRIGGER_SUSPEND: | 559 | case SNDRV_PCM_TRIGGER_SUSPEND: |
556 | case SNDRV_PCM_TRIGGER_STOP: | 560 | case SNDRV_PCM_TRIGGER_STOP: |
557 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 561 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
562 | if (saif->state == MXS_SAIF_STATE_STOPPED) | ||
563 | return 0; | ||
564 | |||
558 | dev_dbg(cpu_dai->dev, "stop\n"); | 565 | dev_dbg(cpu_dai->dev, "stop\n"); |
559 | 566 | ||
560 | /* wait a while for the current sample to complete */ | 567 | /* 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, | |||
575 | } | 582 | } |
576 | 583 | ||
577 | master_saif->ongoing = 0; | 584 | master_saif->ongoing = 0; |
585 | saif->state = MXS_SAIF_STATE_STOPPED; | ||
578 | 586 | ||
579 | break; | 587 | break; |
580 | default: | 588 | default: |
diff --git a/sound/soc/mxs/mxs-saif.h b/sound/soc/mxs/mxs-saif.h index 53eaa4bf0e27..fbaf7badfdfb 100644 --- a/sound/soc/mxs/mxs-saif.h +++ b/sound/soc/mxs/mxs-saif.h | |||
@@ -124,6 +124,11 @@ struct mxs_saif { | |||
124 | 124 | ||
125 | u32 fifo_underrun; | 125 | u32 fifo_underrun; |
126 | u32 fifo_overrun; | 126 | u32 fifo_overrun; |
127 | |||
128 | enum { | ||
129 | MXS_SAIF_STATE_STOPPED, | ||
130 | MXS_SAIF_STATE_RUNNING, | ||
131 | } state; | ||
127 | }; | 132 | }; |
128 | 133 | ||
129 | extern int mxs_saif_put_mclk(unsigned int saif_id); | 134 | extern int mxs_saif_put_mclk(unsigned int saif_id); |