]> git.karo-electronics.de Git - linux-beck.git/blobdiff - sound/soc/codecs/arizona.c
Merge branch 'topic/arizona' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-beck.git] / sound / soc / codecs / arizona.c
index 65977bc0db194b2442dc946ce83c3f5a16de15f1..29202610dd0dd90d72329265633844a3d833d640 100644 (file)
@@ -735,7 +735,25 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
                   struct snd_kcontrol *kcontrol,
                   int event)
 {
+       struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
+       struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
+
        switch (event) {
+       case SND_SOC_DAPM_PRE_PMU:
+               switch (w->shift) {
+               case ARIZONA_OUT1L_ENA_SHIFT:
+               case ARIZONA_OUT1R_ENA_SHIFT:
+               case ARIZONA_OUT2L_ENA_SHIFT:
+               case ARIZONA_OUT2R_ENA_SHIFT:
+               case ARIZONA_OUT3L_ENA_SHIFT:
+               case ARIZONA_OUT3R_ENA_SHIFT:
+                       priv->out_up_pending++;
+                       priv->out_up_delay += 17;
+                       break;
+               default:
+                       break;
+               }
+               break;
        case SND_SOC_DAPM_POST_PMU:
                switch (w->shift) {
                case ARIZONA_OUT1L_ENA_SHIFT:
@@ -744,13 +762,50 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
                case ARIZONA_OUT2R_ENA_SHIFT:
                case ARIZONA_OUT3L_ENA_SHIFT:
                case ARIZONA_OUT3R_ENA_SHIFT:
-                       msleep(17);
+                       priv->out_up_pending--;
+                       if (!priv->out_up_pending) {
+                               msleep(priv->out_up_delay);
+                               priv->out_up_delay = 0;
+                       }
                        break;
 
                default:
                        break;
                }
                break;
+       case SND_SOC_DAPM_PRE_PMD:
+               switch (w->shift) {
+               case ARIZONA_OUT1L_ENA_SHIFT:
+               case ARIZONA_OUT1R_ENA_SHIFT:
+               case ARIZONA_OUT2L_ENA_SHIFT:
+               case ARIZONA_OUT2R_ENA_SHIFT:
+               case ARIZONA_OUT3L_ENA_SHIFT:
+               case ARIZONA_OUT3R_ENA_SHIFT:
+                       priv->out_down_pending++;
+                       priv->out_down_delay++;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case SND_SOC_DAPM_POST_PMD:
+               switch (w->shift) {
+               case ARIZONA_OUT1L_ENA_SHIFT:
+               case ARIZONA_OUT1R_ENA_SHIFT:
+               case ARIZONA_OUT2L_ENA_SHIFT:
+               case ARIZONA_OUT2R_ENA_SHIFT:
+               case ARIZONA_OUT3L_ENA_SHIFT:
+               case ARIZONA_OUT3R_ENA_SHIFT:
+                       priv->out_down_pending--;
+                       if (!priv->out_down_pending) {
+                               msleep(priv->out_down_delay);
+                               priv->out_down_delay = 0;
+                       }
+                       break;
+               default:
+                       break;
+               }
+               break;
        }
 
        return 0;
@@ -774,6 +829,9 @@ int arizona_hp_ev(struct snd_soc_dapm_widget *w,
        case SND_SOC_DAPM_PRE_PMD:
                val = 0;
                break;
+       case SND_SOC_DAPM_PRE_PMU:
+       case SND_SOC_DAPM_POST_PMD:
+               return arizona_out_ev(w, kcontrol, event);
        default:
                return -EINVAL;
        }