|
|
@@ -1093,7 +1093,53 @@ static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
+static int soc_pcm_trigger_start(struct snd_pcm_substream *substream, int cmd)
|
|
|
+{
|
|
|
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
|
+ struct snd_soc_component *component;
|
|
|
+ struct snd_soc_rtdcom_list *rtdcom;
|
|
|
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
|
|
+ struct snd_soc_dai *codec_dai;
|
|
|
+ int i, ret;
|
|
|
+
|
|
|
+ if (rtd->dai_link->ops->trigger) {
|
|
|
+ ret = rtd->dai_link->ops->trigger(substream, cmd);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ for_each_rtdcom(rtd, rtdcom) {
|
|
|
+ component = rtdcom->component;
|
|
|
+
|
|
|
+ if (!component->driver->ops ||
|
|
|
+ !component->driver->ops->trigger)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ ret = component->driver->ops->trigger(substream, cmd);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cpu_dai->driver->ops->trigger) {
|
|
|
+ ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < rtd->num_codecs; i++) {
|
|
|
+ codec_dai = rtd->codec_dais[i];
|
|
|
+ if (codec_dai->driver->ops->trigger) {
|
|
|
+ ret = codec_dai->driver->ops->trigger(substream,
|
|
|
+ cmd, codec_dai);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int soc_pcm_trigger_stop(struct snd_pcm_substream *substream, int cmd)
|
|
|
{
|
|
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
|
struct snd_soc_component *component;
|
|
|
@@ -1112,6 +1158,12 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (cpu_dai->driver->ops->trigger) {
|
|
|
+ ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
for_each_rtdcom(rtd, rtdcom) {
|
|
|
component = rtdcom->component;
|
|
|
|
|
|
@@ -1124,12 +1176,6 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- if (cpu_dai->driver->ops->trigger) {
|
|
|
- ret = cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai);
|
|
|
- if (ret < 0)
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
if (rtd->dai_link->ops->trigger) {
|
|
|
ret = rtd->dai_link->ops->trigger(substream, cmd);
|
|
|
if (ret < 0)
|
|
|
@@ -1139,6 +1185,28 @@ static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ switch (cmd) {
|
|
|
+ case SNDRV_PCM_TRIGGER_START:
|
|
|
+ case SNDRV_PCM_TRIGGER_RESUME:
|
|
|
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
|
+ ret = soc_pcm_trigger_start(substream, cmd);
|
|
|
+ break;
|
|
|
+ case SNDRV_PCM_TRIGGER_STOP:
|
|
|
+ case SNDRV_PCM_TRIGGER_SUSPEND:
|
|
|
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
|
+ ret = soc_pcm_trigger_stop(substream, cmd);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream,
|
|
|
int cmd)
|
|
|
{
|