From 293f09b631ca73b2110648618d7b890220f21b84 Mon Sep 17 00:00:00 2001 From: Adrian Alonso Date: Mon, 14 May 2012 18:48:27 -0500 Subject: [PATCH] ENGR00209384-1 mxc_spdif: add trigger handler function * Add trigger function in order to handle user space events start/stop/pause playback/capture Signed-off-by: Adrian Alonso --- sound/soc/codecs/mxc_spdif.c | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/sound/soc/codecs/mxc_spdif.c b/sound/soc/codecs/mxc_spdif.c index 613caf633fae..8c163fbd7c7d 100644 --- a/sound/soc/codecs/mxc_spdif.c +++ b/sound/soc/codecs/mxc_spdif.c @@ -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, }; -- 2.39.5