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