mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	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: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
		
							parent
							
								
									121df681da
								
							
						
					
					
						commit
						03510ca07a
					
				| @ -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); | ||||
| 
 | ||||
| 	mutex_unlock(&codec->mutex); | ||||
| 	if (changed) | ||||
| 		snd_soc_dapm_sync_unlocked(dapm); | ||||
| 
 | ||||
| 	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() */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Charles Keepax
						Charles Keepax