ALSA: ASoC: Factor PGA DAPM handling into main
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 17 Jul 2008 14:06:51 +0000 (15:06 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 17 Jul 2008 14:17:17 +0000 (16:17 +0200)
This allows pre and post event hooks to be provided for PGA widgets.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/soc/soc-dapm.c

index 17698ef58dfb5ab707c4cca31158ea8fac4d87f8..820347c9ae4bbc5d5281e981e94f0cd27d2e28ae 100644 (file)
@@ -523,24 +523,6 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
                                continue;
                        }
 
-                       /* programmable gain/attenuation */
-                       if (w->id == snd_soc_dapm_pga) {
-                               int on;
-                               in = is_connected_input_ep(w);
-                               dapm_clear_walk(w->codec);
-                               out = is_connected_output_ep(w);
-                               dapm_clear_walk(w->codec);
-                               w->power = on = (out != 0 && in != 0) ? 1 : 0;
-
-                               if (!on)
-                                       dapm_set_pga(w, on); /* lower volume to reduce pops */
-                               dapm_update_bits(w);
-                               if (on)
-                                       dapm_set_pga(w, on); /* restore volume from zero */
-
-                               continue;
-                       }
-
                        /* pre and post event widgets */
                        if (w->id == snd_soc_dapm_pre) {
                                if (!w->event)
@@ -611,8 +593,16 @@ static int dapm_power_widgets(struct snd_soc_codec *codec, int event)
                                        return ret;
                        }
 
+                       /* Lower PGA volume to reduce pops */
+                       if (w->id == snd_soc_dapm_pga && !power)
+                               dapm_set_pga(w, power);
+
                        dapm_update_bits(w);
 
+                       /* Raise PGA volume to reduce pops */
+                       if (w->id == snd_soc_dapm_pga && power)
+                               dapm_set_pga(w, power);
+
                        /* power up post event */
                        if (power && w->event &&
                            (w->event_flags & SND_SOC_DAPM_POST_PMU)) {