Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88cf632a authored by Markus Pargmann's avatar Markus Pargmann Committed by Mark Brown
Browse files

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: default avatarMarkus Pargmann <mpa@pengutronix.de>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 9f1614aa
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -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_START:
	case SNDRV_PCM_TRIGGER_RESUME:
	case SNDRV_PCM_TRIGGER_RESUME:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
		if (saif->state == MXS_SAIF_STATE_RUNNING)
			return 0;

		dev_dbg(cpu_dai->dev, "start\n");
		dev_dbg(cpu_dai->dev, "start\n");


		clk_enable(master_saif->clk);
		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;
		master_saif->ongoing = 1;
		saif->state = MXS_SAIF_STATE_RUNNING;


		dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n",
		dev_dbg(saif->dev, "CTRL 0x%x STAT 0x%x\n",
			__raw_readl(saif->base + SAIF_CTRL),
			__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_SUSPEND:
	case SNDRV_PCM_TRIGGER_STOP:
	case SNDRV_PCM_TRIGGER_STOP:
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
		if (saif->state == MXS_SAIF_STATE_STOPPED)
			return 0;

		dev_dbg(cpu_dai->dev, "stop\n");
		dev_dbg(cpu_dai->dev, "stop\n");


		/* wait a while for the current sample to complete */
		/* 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;
		master_saif->ongoing = 0;
		saif->state = MXS_SAIF_STATE_STOPPED;


		break;
		break;
	default:
	default:
+5 −0
Original line number Original line Diff line number Diff line
@@ -124,6 +124,11 @@ struct mxs_saif {


	u32 fifo_underrun;
	u32 fifo_underrun;
	u32 fifo_overrun;
	u32 fifo_overrun;

	enum {
		MXS_SAIF_STATE_STOPPED,
		MXS_SAIF_STATE_RUNNING,
	} state;
};
};


extern int mxs_saif_put_mclk(unsigned int saif_id);
extern int mxs_saif_put_mclk(unsigned int saif_id);