diff mbox

[2/3] ASoC: mxs-saif: Store saif state

Message ID 1381486264-1672-3-git-send-email-mpa@pengutronix.de (mailing list archive)
State New, archived
Headers show

Commit Message

Markus Pargmann Oct. 11, 2013, 10:11 a.m. UTC
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>
---
 sound/soc/mxs/mxs-saif.c | 8 ++++++++
 sound/soc/mxs/mxs-saif.h | 5 +++++
 2 files changed, 13 insertions(+)

Comments

Lothar Waßmann Oct. 11, 2013, 10:31 a.m. UTC | #1
Hi,

> 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>
> ---
>  sound/soc/mxs/mxs-saif.c | 8 ++++++++
>  sound/soc/mxs/mxs-saif.h | 5 +++++
>  2 files changed, 13 insertions(+)
> 
> diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
> index b56b8a0..c8ead01 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,
>  	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;
>
It seems to me that you could use the already existing variable
'ongoing' that already reflects the state like you need it.


Lothar Waßmann
Markus Pargmann Oct. 11, 2013, 10:46 a.m. UTC | #2
Hi,

On Fri, Oct 11, 2013 at 12:31:46PM +0200, Lothar Waßmann wrote:
> Hi,
> 
> > 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>
> > ---
> >  sound/soc/mxs/mxs-saif.c | 8 ++++++++
> >  sound/soc/mxs/mxs-saif.h | 5 +++++
> >  2 files changed, 13 insertions(+)
> > 
> > diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
> > index b56b8a0..c8ead01 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,
> >  	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;
> >
> It seems to me that you could use the already existing variable
> 'ongoing' that already reflects the state like you need it.

'ongoing' can only be used if master_saif == saif. Otherwise this
variable does not reflect the state of the saif. For example there could
be parallel audio playback and recording, setting the variable only on
the master_saif->ongoing but not for the second saif.

Regards,

Markus Pargmann
diff mbox

Patch

diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
index b56b8a0..c8ead01 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,
 	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:
diff --git a/sound/soc/mxs/mxs-saif.h b/sound/soc/mxs/mxs-saif.h
index 53eaa4b..fbaf7ba 100644
--- a/sound/soc/mxs/mxs-saif.h
+++ b/sound/soc/mxs/mxs-saif.h
@@ -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);