ASoC: dapm: Add startup & shutdown for dai_links
authorJeeja KP <jeeja.kp@intel.com>
Tue, 20 Oct 2015 17:00:07 +0000 (22:30 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 22 Oct 2015 14:23:23 +0000 (15:23 +0100)
For DAI link events, DSPs would like to get notified for startup
and shutdown event as well apart for existing hw_params. This
helps managing DSP resource allocation and freeup on these events
So add support for startup and shutdown for
snd_soc_dai_link_event()

Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-dapm.c

index 9762ac4efdeb90e0a1f527f63f62030eacec3bfa..a28d6a10bad0a139e63a4660ccdeefa97c609208 100644 (file)
@@ -3478,11 +3478,29 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
        switch (event) {
        case SND_SOC_DAPM_PRE_PMU:
                substream.stream = SNDRV_PCM_STREAM_CAPTURE;
+               if (source->driver->ops && source->driver->ops->startup) {
+                       ret = source->driver->ops->startup(&substream, source);
+                       if (ret < 0) {
+                               dev_err(source->dev,
+                                       "ASoC: startup() failed: %d\n", ret);
+                               goto out;
+                       }
+                       source->active++;
+               }
                ret = soc_dai_hw_params(&substream, params, source);
                if (ret < 0)
                        goto out;
 
                substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
+               if (sink->driver->ops && sink->driver->ops->startup) {
+                       ret = sink->driver->ops->startup(&substream, sink);
+                       if (ret < 0) {
+                               dev_err(sink->dev,
+                                       "ASoC: startup() failed: %d\n", ret);
+                               goto out;
+                       }
+                       sink->active++;
+               }
                ret = soc_dai_hw_params(&substream, params, sink);
                if (ret < 0)
                        goto out;
@@ -3502,6 +3520,18 @@ static int snd_soc_dai_link_event(struct snd_soc_dapm_widget *w,
                if (ret != 0 && ret != -ENOTSUPP)
                        dev_warn(sink->dev, "ASoC: Failed to mute: %d\n", ret);
                ret = 0;
+
+               source->active--;
+               if (source->driver->ops && source->driver->ops->shutdown) {
+                       substream.stream = SNDRV_PCM_STREAM_CAPTURE;
+                       source->driver->ops->shutdown(&substream, source);
+               }
+
+               sink->active--;
+               if (sink->driver->ops && sink->driver->ops->shutdown) {
+                       substream.stream = SNDRV_PCM_STREAM_PLAYBACK;
+                       sink->driver->ops->shutdown(&substream, sink);
+               }
                break;
 
        default: