]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00209384-1 mxc_spdif: add trigger handler function
authorAdrian Alonso <aalonso@freescale.com>
Mon, 14 May 2012 23:48:27 +0000 (18:48 -0500)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:38 +0000 (08:34 +0200)
* Add trigger function in order to handle user
  space events start/stop/pause playback/capture

Signed-off-by: Adrian Alonso <aalonso@freescale.com>
sound/soc/codecs/mxc_spdif.c

index 613caf633fae42dd87373027cebdaded0c5c200f..8c163fbd7c7d6e75d623b9f5e30499ee2ac3c098 100644 (file)
@@ -633,6 +633,33 @@ static int mxc_spdif_playback_shutdown(struct snd_pcm_substream *substream,
        return 0;
 }
 
+static int mxc_spdif_playback_trigger(struct snd_pcm_substream *substream,
+                               int cmd, struct snd_soc_dai *dai)
+{
+       struct snd_soc_codec *codec = dai->codec;
+       struct mxc_spdif_priv *spdif_priv = snd_soc_codec_get_drvdata(codec);
+       struct mxc_spdif_platform_data *plat_data = spdif_priv->plat_data;
+       int ret = 0;
+
+       if (!plat_data->spdif_tx)
+               return -EINVAL;
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_RESUME:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
 static int mxc_spdif_capture_startup(struct snd_pcm_substream *substream,
                                              struct snd_soc_dai *dai)
 {
@@ -757,6 +784,33 @@ static int mxc_spdif_capture_shutdown(struct snd_pcm_substream *substream,
        return 0;
 }
 
+static int mxc_spdif_capture_trigger(struct snd_pcm_substream *substream,
+                               int cmd, struct snd_soc_dai *dai)
+{
+       struct snd_soc_codec *codec = dai->codec;
+       struct mxc_spdif_priv *spdif_priv = snd_soc_codec_get_drvdata(codec);
+       struct mxc_spdif_platform_data *plat_data = spdif_priv->plat_data;
+       int ret = 0;
+
+       if (!plat_data->spdif_rx)
+               return -EINVAL;
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_RESUME:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+               break;
+       case SNDRV_PCM_TRIGGER_STOP:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
 /*
  * MXC SPDIF IEC958 controller(mixer) functions
  *
@@ -1117,9 +1171,23 @@ static int mxc_spdif_prepare(struct snd_pcm_substream *substream,
        return ret;
 }
 
+static int mxc_spdif_trigger(struct snd_pcm_substream *substream,
+                               int cmd, struct snd_soc_dai *dai)
+{
+       int ret = 0;
+
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+               ret = mxc_spdif_playback_trigger(substream, cmd, dai);
+       else
+               ret = mxc_spdif_capture_trigger(substream, cmd, dai);
+
+       return ret;
+}
+
 struct snd_soc_dai_ops mxc_spdif_codec_dai_ops = {
        .startup = mxc_spdif_startup,
        .prepare = mxc_spdif_prepare,
+       .trigger = mxc_spdif_trigger,
        .shutdown = mxc_spdif_shutdown,
 };