ASoC: Skip noop reconfiguration of WM8958 DSP2 algorithms
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 16 May 2011 01:02:53 +0000 (18:02 -0700)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Mon, 16 May 2011 15:55:20 +0000 (08:55 -0700)
If we're setting the currently applied value for one of the DSP algorithm
configurations we can just skip all the handling as the control set is a
noop. This ensures we do not disrupt a running DSP.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Cc: stable@kernel.org
sound/soc/codecs/wm8958-dsp2.c

index 5d4bc7a21df7766527746217abc76bbf2582a8a5..ca26779bb6b21c99a92c9738ef6372c28b840864 100644 (file)
@@ -508,6 +508,9 @@ static int wm8958_mbc_put(struct snd_kcontrol *kcontrol,
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 
+       if (wm8994->mbc_ena[mbc] == ucontrol->value.integer.value[0])
+               return 0;
+
        if (ucontrol->value.integer.value[0] > 1)
                return -EINVAL;
 
@@ -628,6 +631,9 @@ static int wm8958_vss_put(struct snd_kcontrol *kcontrol,
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 
+       if (wm8994->vss_ena[vss] == ucontrol->value.integer.value[0])
+               return 0;
+
        if (ucontrol->value.integer.value[0] > 1)
                return -EINVAL;
 
@@ -689,6 +695,16 @@ static int wm8958_hpf_put(struct snd_kcontrol *kcontrol,
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 
+       if (hpf < 3) {
+               if (wm8994->hpf1_ena[hpf % 3] ==
+                   ucontrol->value.integer.value[0])
+                       return 0;
+       } else {
+               if (wm8994->hpf2_ena[hpf % 3] ==
+                   ucontrol->value.integer.value[0])
+                       return 0;
+       }
+
        if (ucontrol->value.integer.value[0] > 1)
                return -EINVAL;
 
@@ -782,6 +798,9 @@ static int wm8958_enh_eq_put(struct snd_kcontrol *kcontrol,
        struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
        struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
 
+       if (wm8994->enh_eq_ena[eq] == ucontrol->value.integer.value[0])
+               return 0;
+
        if (ucontrol->value.integer.value[0] > 1)
                return -EINVAL;