Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03510ca0 authored by Charles Keepax's avatar Charles Keepax Committed by Mark Brown
Browse files

ASoC: ams-delta: Update locking around use of DAPM pin API



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: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 121df681
Loading
Loading
Loading
Loading
+26 −19
Original line number Original line Diff line number Diff line
@@ -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_mutex_lock(dapm);
	snd_soc_dapm_enable_pin(dapm, "Earpiece");

	snd_soc_dapm_enable_pin(dapm, "Microphone");
	snd_soc_dapm_disable_pin_unlocked(dapm, "Mouthpiece");
	snd_soc_dapm_disable_pin(dapm, "Speaker");
	snd_soc_dapm_enable_pin_unlocked(dapm, "Earpiece");
	snd_soc_dapm_disable_pin(dapm, "AGCIN");
	snd_soc_dapm_enable_pin_unlocked(dapm, "Microphone");
	snd_soc_dapm_sync(dapm);
	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() */