ASoC: ams-delta: Update locking around use of DAPM pin API
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Tue, 18 Feb 2014 15:22:22 +0000 (15:22 +0000)
committerMark Brown <broonie@linaro.org>
Thu, 20 Feb 2014 10:22:58 +0000 (19:22 +0900)
The pin updates in this driver look like they are intended to be done
atomically, update to do so. It looks like these were originally locked
with the CODEC mutex and not updated since the patch "ASoC: dapm: Use
DAPM mutex for DAPM ops instead of codec mutex", so remove the original
CODEC mutex locking as well.

Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/omap/ams-delta.c

index 629446482a917267706c76982863577a426da11c..5750de197d0da9bdb86de5a26b0f71fcc635b5c4 100644 (file)
@@ -106,57 +106,59 @@ static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol,
        if (ucontrol->value.enumerated.item[0] >= control->max)
                return -EINVAL;
 
-       mutex_lock(&codec->mutex);
+       snd_soc_dapm_mutex_lock(dapm);
 
        /* Translate selection to bitmap */
        pins = ams_delta_audio_mode_pins[ucontrol->value.enumerated.item[0]];
 
        /* Setup pins after corresponding bits if changed */
        pin = !!(pins & (1 << AMS_DELTA_MOUTHPIECE));
+
        if (pin != snd_soc_dapm_get_pin_status(dapm, "Mouthpiece")) {
                changed = 1;
                if (pin)
-                       snd_soc_dapm_enable_pin(dapm, "Mouthpiece");
+                       snd_soc_dapm_enable_pin_unlocked(dapm, "Mouthpiece");
                else
-                       snd_soc_dapm_disable_pin(dapm, "Mouthpiece");
+                       snd_soc_dapm_disable_pin_unlocked(dapm, "Mouthpiece");
        }
        pin = !!(pins & (1 << AMS_DELTA_EARPIECE));
        if (pin != snd_soc_dapm_get_pin_status(dapm, "Earpiece")) {
                changed = 1;
                if (pin)
-                       snd_soc_dapm_enable_pin(dapm, "Earpiece");
+                       snd_soc_dapm_enable_pin_unlocked(dapm, "Earpiece");
                else
-                       snd_soc_dapm_disable_pin(dapm, "Earpiece");
+                       snd_soc_dapm_disable_pin_unlocked(dapm, "Earpiece");
        }
        pin = !!(pins & (1 << AMS_DELTA_MICROPHONE));
        if (pin != snd_soc_dapm_get_pin_status(dapm, "Microphone")) {
                changed = 1;
                if (pin)
-                       snd_soc_dapm_enable_pin(dapm, "Microphone");
+                       snd_soc_dapm_enable_pin_unlocked(dapm, "Microphone");
                else
-                       snd_soc_dapm_disable_pin(dapm, "Microphone");
+                       snd_soc_dapm_disable_pin_unlocked(dapm, "Microphone");
        }
        pin = !!(pins & (1 << AMS_DELTA_SPEAKER));
        if (pin != snd_soc_dapm_get_pin_status(dapm, "Speaker")) {
                changed = 1;
                if (pin)
-                       snd_soc_dapm_enable_pin(dapm, "Speaker");
+                       snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker");
                else
-                       snd_soc_dapm_disable_pin(dapm, "Speaker");
+                       snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker");
        }
        pin = !!(pins & (1 << AMS_DELTA_AGC));
        if (pin != ams_delta_audio_agc) {
                ams_delta_audio_agc = pin;
                changed = 1;
                if (pin)
-                       snd_soc_dapm_enable_pin(dapm, "AGCIN");
+                       snd_soc_dapm_enable_pin_unlocked(dapm, "AGCIN");
                else
-                       snd_soc_dapm_disable_pin(dapm, "AGCIN");
+                       snd_soc_dapm_disable_pin_unlocked(dapm, "AGCIN");
        }
+
        if (changed)
-               snd_soc_dapm_sync(dapm);
+               snd_soc_dapm_sync_unlocked(dapm);
 
-       mutex_unlock(&codec->mutex);
+       snd_soc_dapm_mutex_unlock(dapm);
 
        return changed;
 }
@@ -315,12 +317,17 @@ static void cx81801_close(struct tty_struct *tty)
        v253_ops.close(tty);
 
        /* Revert back to default audio input/output constellation */
-       snd_soc_dapm_disable_pin(dapm, "Mouthpiece");
-       snd_soc_dapm_enable_pin(dapm, "Earpiece");
-       snd_soc_dapm_enable_pin(dapm, "Microphone");
-       snd_soc_dapm_disable_pin(dapm, "Speaker");
-       snd_soc_dapm_disable_pin(dapm, "AGCIN");
-       snd_soc_dapm_sync(dapm);
+       snd_soc_dapm_mutex_lock(dapm);
+
+       snd_soc_dapm_disable_pin_unlocked(dapm, "Mouthpiece");
+       snd_soc_dapm_enable_pin_unlocked(dapm, "Earpiece");
+       snd_soc_dapm_enable_pin_unlocked(dapm, "Microphone");
+       snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker");
+       snd_soc_dapm_disable_pin_unlocked(dapm, "AGCIN");
+
+       snd_soc_dapm_sync_unlocked(dapm);
+
+       snd_soc_dapm_mutex_unlock(codec);
 }
 
 /* Line discipline .hangup() */