]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'topic/arizona' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorMark Brown <broonie@kernel.org>
Tue, 27 Jan 2015 23:50:47 +0000 (23:50 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 27 Jan 2015 23:52:44 +0000 (23:52 +0000)
1  2 
sound/soc/codecs/arizona.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/codecs/wm8997.c

index 65977bc0db194b2442dc946ce83c3f5a16de15f1,32bc609f23e44bcaf7d3c299e7f625d9953154a9..29202610dd0dd90d72329265633844a3d833d640
@@@ -84,7 -84,7 +84,7 @@@ static int arizona_spk_ev(struct snd_so
                          struct snd_kcontrol *kcontrol,
                          int event)
  {
 -      struct snd_soc_codec *codec = w->codec;
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
        struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
        bool manual_ena = false;
@@@ -692,8 -692,7 +692,8 @@@ static void arizona_in_set_vu(struct sn
  int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
                  int event)
  {
 -      struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec);
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
        unsigned int reg;
  
        if (w->shift % 2)
                priv->in_pending++;
                break;
        case SND_SOC_DAPM_POST_PMU:
 -              snd_soc_update_bits(w->codec, reg, ARIZONA_IN1L_MUTE, 0);
 +              snd_soc_update_bits(codec, reg, ARIZONA_IN1L_MUTE, 0);
  
                /* If this is the last input pending then allow VU */
                priv->in_pending--;
                if (priv->in_pending == 0) {
                        msleep(1);
 -                      arizona_in_set_vu(w->codec, 1);
 +                      arizona_in_set_vu(codec, 1);
                }
                break;
        case SND_SOC_DAPM_PRE_PMD:
 -              snd_soc_update_bits(w->codec, reg,
 +              snd_soc_update_bits(codec, reg,
                                    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU,
                                    ARIZONA_IN1L_MUTE | ARIZONA_IN_VU);
                break;
        case SND_SOC_DAPM_POST_PMD:
                /* Disable volume updates if no inputs are enabled */
 -              reg = snd_soc_read(w->codec, ARIZONA_INPUT_ENABLES);
 +              reg = snd_soc_read(codec, ARIZONA_INPUT_ENABLES);
                if (reg == 0)
 -                      arizona_in_set_vu(w->codec, 0);
 +                      arizona_in_set_vu(codec, 0);
        }
  
        return 0;
@@@ -735,7 -734,24 +735,25 @@@ int arizona_out_ev(struct snd_soc_dapm_
                   struct snd_kcontrol *kcontrol,
                   int event)
  {
 -      struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec);
++      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:
                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;
@@@ -761,8 -814,7 +816,8 @@@ int arizona_hp_ev(struct snd_soc_dapm_w
                   struct snd_kcontrol *kcontrol,
                   int event)
  {
 -      struct arizona_priv *priv = snd_soc_codec_get_drvdata(w->codec);
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 +      struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
        struct arizona *arizona = priv->arizona;
        unsigned int mask = 1 << w->shift;
        unsigned int val;
        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;
        }
index f57235be8b0ab2a4c44a0d96f398c37d2e74048f,154d67d7f249c38f6e3cd0875c0c722ce9fba2a8..6d0fe0ac95a3f6121d87c52cfa4f17f6ec844651
@@@ -28,6 -28,7 +28,7 @@@
  
  #include <linux/mfd/arizona/core.h>
  #include <linux/mfd/arizona/registers.h>
+ #include <asm/unaligned.h>
  
  #include "arizona.h"
  #include "wm5102.h"
@@@ -580,7 -581,7 +581,7 @@@ static const struct reg_default wm5102_
  static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
                            struct snd_kcontrol *kcontrol, int event)
  {
 -      struct snd_soc_codec *codec = w->codec;
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
        struct regmap *regmap = arizona->regmap;
        const struct reg_default *patch = NULL;
@@@ -617,11 -618,10 +618,10 @@@ static int wm5102_out_comp_coeff_get(st
  {
        struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
        struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
-       uint16_t data;
  
        mutex_lock(&arizona->dac_comp_lock);
-       data = cpu_to_be16(arizona->dac_comp_coeff);
-       memcpy(ucontrol->value.bytes.data, &data, sizeof(data));
+       put_unaligned_be16(arizona->dac_comp_coeff,
+                          ucontrol->value.bytes.data);
        mutex_unlock(&arizona->dac_comp_lock);
  
        return 0;
@@@ -1272,19 -1272,24 +1272,24 @@@ SND_SOC_DAPM_MUX("AEC Loopback", ARIZON
  
  SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
                   ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
                   ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT2L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT2R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
index 7cb02e9d3b53c85d8dd71e1003b08bb50dcf58e4,33eefec54be41c9e6705802337f371aeba81673b..fbaeddb3e9033a3044b4995265dce2849b348160
@@@ -134,7 -134,7 +134,7 @@@ static const struct reg_default wm5110_
  static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w,
                            struct snd_kcontrol *kcontrol, int event)
  {
 -      struct snd_soc_codec *codec = w->codec;
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
        struct regmap *regmap = arizona->regmap;
        const struct reg_default *patch = NULL;
@@@ -905,22 -905,28 +905,28 @@@ SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0
  
  SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
                   ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
                   ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT2L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT2R", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT2R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT3R", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3R_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
index 0760ede0a6e5fc380d42d7b6c11146ee63928bd2,911132943b50057a44a24dc530ec783904d37dd4..a4d11770630cdd9bd169836c5e14e0f8dfc5633b
@@@ -84,7 -84,7 +84,7 @@@ static const struct reg_default wm8997_
  static int wm8997_sysclk_ev(struct snd_soc_dapm_widget *w,
                            struct snd_kcontrol *kcontrol, int event)
  {
 -      struct snd_soc_codec *codec = w->codec;
 +      struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
        struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
        struct regmap *regmap = arizona->regmap;
        const struct reg_default *patch = NULL;
@@@ -610,13 -610,16 +610,16 @@@ SND_SOC_DAPM_MUX("AEC Loopback", ARIZON
  
  SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM,
                   ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM,
                   ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT3L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT3L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
-                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
+                  SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD |
+                  SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_PGA_E("OUT5L", ARIZONA_OUTPUT_ENABLES_1,
                   ARIZONA_OUT5L_ENA_SHIFT, 0, NULL, 0, arizona_out_ev,
                   SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),