aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Pargmann <mpa@pengutronix.de>2013-10-11 06:11:03 -0400
committerMark Brown <broonie@linaro.org>2013-10-14 13:01:50 -0400
commit88cf632a135188db35b4db412a06b155fa444eb1 (patch)
treed08df40ce6ac0261ef7f5ab2205e7ee98435cae9
parent9f1614aae59033b79941220f65ad36f5fe54a579 (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.c8
-rw-r--r--sound/soc/mxs/mxs-saif.h5
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
129extern int mxs_saif_put_mclk(unsigned int saif_id); 134extern int mxs_saif_put_mclk(unsigned int saif_id);