]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ASoC: dapm: Provide early event callbacks for power up and down
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 25 Feb 2013 15:14:19 +0000 (15:14 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sun, 12 May 2013 16:44:18 +0000 (20:44 +0400)
Some devices may benefit from being able to start some parts of the widget
power up/down sequence earlier on in the sequence than the point at which
the final power state is committed. Support these by providing events which
are called before any power state changes are done.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
include/sound/soc-dapm.h
sound/soc/soc-dapm.c

index d4609029f014e3dc9cd4592e6719bba470f4bb67..f4f85dd1cd970bd36da5784bd1264537d4b43961 100644 (file)
@@ -311,6 +311,8 @@ struct device;
 #define SND_SOC_DAPM_POST_PMD  0x8             /* after widget power down */
 #define SND_SOC_DAPM_PRE_REG   0x10    /* before audio path setup */
 #define SND_SOC_DAPM_POST_REG  0x20    /* after audio path setup */
+#define SND_SOC_DAPM_WILL_PMU   0x40    /* called at start of sequence */
+#define SND_SOC_DAPM_WILL_PMD   0x80    /* called at start of sequence */
 #define SND_SOC_DAPM_PRE_POST_PMD \
                                (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD)
 
index a80c883bb8be29eeba512d86e46af833d472c833..e4e5420de725afbad7ebc475e1f7d03cf8d28826 100644 (file)
@@ -1277,6 +1277,14 @@ static void dapm_seq_check_event(struct snd_soc_dapm_context *dapm,
                ev_name = "POST_PMD";
                power = 0;
                break;
+       case SND_SOC_DAPM_WILL_PMU:
+               ev_name = "WILL_PMU";
+               power = 1;
+               break;
+       case SND_SOC_DAPM_WILL_PMD:
+               ev_name = "WILL_PMD";
+               power = 0;
+               break;
        default:
                BUG();
                return;
@@ -1737,6 +1745,14 @@ static int dapm_power_widgets(struct snd_soc_dapm_context *dapm, int event)
                                        &async_domain);
        async_synchronize_full_domain(&async_domain);
 
+       list_for_each_entry(w, &down_list, list) {
+               dapm_seq_check_event(dapm, w, SND_SOC_DAPM_WILL_PMD);
+       }
+
+       list_for_each_entry(w, &up_list, list) {
+               dapm_seq_check_event(dapm, w, SND_SOC_DAPM_WILL_PMU);
+       }
+
        /* Power down widgets first; try to avoid amplifying pops. */
        dapm_seq_run(dapm, &down_list, event, false);