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); |
