]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - sound/soc/soc-core.c
ASoC: Allow DAI links to be kept active over suspend
[net-next-2.6.git] / sound / soc / soc-core.c
index 8661e5b4adb1ea6c9f6128d9dafa646a1653e54e..34f71bf601400df692578a02865060ecbcb5afea 100644 (file)
@@ -893,19 +893,31 @@ static int soc_suspend(struct device *dev)
        /* mute any active DAC's */
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (dai->ops->digital_mute && dai->playback.active)
                        dai->ops->digital_mute(dai, 1);
        }
 
        /* suspend all pcms */
-       for (i = 0; i < card->num_links; i++)
+       for (i = 0; i < card->num_links; i++) {
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                snd_pcm_suspend_all(card->dai_link[i].pcm);
+       }
 
        if (card->suspend_pre)
                card->suspend_pre(pdev, PMSG_SUSPEND);
 
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai  *cpu_dai = card->dai_link[i].cpu_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (cpu_dai->suspend && !cpu_dai->ac97_control)
                        cpu_dai->suspend(cpu_dai);
                if (platform->suspend)
@@ -918,6 +930,10 @@ static int soc_suspend(struct device *dev)
 
        for (i = 0; i < codec->num_dai; i++) {
                char *stream = codec->dai[i].playback.stream_name;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (stream != NULL)
                        snd_soc_dapm_stream_event(codec, stream,
                                SND_SOC_DAPM_STREAM_SUSPEND);
@@ -943,6 +959,10 @@ static int soc_suspend(struct device *dev)
 
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (cpu_dai->suspend && cpu_dai->ac97_control)
                        cpu_dai->suspend(cpu_dai);
        }
@@ -982,6 +1002,10 @@ static void soc_resume_deferred(struct work_struct *work)
 
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (cpu_dai->resume && cpu_dai->ac97_control)
                        cpu_dai->resume(cpu_dai);
        }
@@ -1004,6 +1028,10 @@ static void soc_resume_deferred(struct work_struct *work)
 
        for (i = 0; i < codec->num_dai; i++) {
                char *stream = codec->dai[i].playback.stream_name;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (stream != NULL)
                        snd_soc_dapm_stream_event(codec, stream,
                                SND_SOC_DAPM_STREAM_RESUME);
@@ -1016,12 +1044,20 @@ static void soc_resume_deferred(struct work_struct *work)
        /* unmute any active DACs */
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai *dai = card->dai_link[i].codec_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (dai->ops->digital_mute && dai->playback.active)
                        dai->ops->digital_mute(dai, 0);
        }
 
        for (i = 0; i < card->num_links; i++) {
                struct snd_soc_dai *cpu_dai = card->dai_link[i].cpu_dai;
+
+               if (card->dai_link[i].ignore_suspend)
+                       continue;
+
                if (cpu_dai->resume && !cpu_dai->ac97_control)
                        cpu_dai->resume(cpu_dai);
                if (platform->resume)