aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles Keepax <ckeepax@opensource.wolfsonmicro.com>2014-02-18 10:22:19 -0500
committerMark Brown <broonie@linaro.org>2014-02-20 05:22:57 -0500
commitbabce8211b194acdc41bc47975b50969a48b84ab (patch)
treeb0df401e90135b336eecd4a2df361e3384affba9
parentf1a3b8d9d4818b88cd7de369da3bb1804c2ad7da (diff)
ASoC: wm8994: 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. Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/codecs/wm8994.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index b9be9cbc4603..e8daf55d37e3 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -2549,43 +2549,52 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,
2549int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode) 2549int wm8994_vmid_mode(struct snd_soc_codec *codec, enum wm8994_vmid_mode mode)
2550{ 2550{
2551 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); 2551 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
2552 struct snd_soc_dapm_context *dapm = &codec->dapm;
2552 2553
2553 switch (mode) { 2554 switch (mode) {
2554 case WM8994_VMID_NORMAL: 2555 case WM8994_VMID_NORMAL:
2556 snd_soc_dapm_mutex_lock(dapm);
2557
2555 if (wm8994->hubs.lineout1_se) { 2558 if (wm8994->hubs.lineout1_se) {
2556 snd_soc_dapm_disable_pin(&codec->dapm, 2559 snd_soc_dapm_disable_pin_unlocked(dapm,
2557 "LINEOUT1N Driver"); 2560 "LINEOUT1N Driver");
2558 snd_soc_dapm_disable_pin(&codec->dapm, 2561 snd_soc_dapm_disable_pin_unlocked(dapm,
2559 "LINEOUT1P Driver"); 2562 "LINEOUT1P Driver");
2560 } 2563 }
2561 if (wm8994->hubs.lineout2_se) { 2564 if (wm8994->hubs.lineout2_se) {
2562 snd_soc_dapm_disable_pin(&codec->dapm, 2565 snd_soc_dapm_disable_pin_unlocked(dapm,
2563 "LINEOUT2N Driver"); 2566 "LINEOUT2N Driver");
2564 snd_soc_dapm_disable_pin(&codec->dapm, 2567 snd_soc_dapm_disable_pin_unlocked(dapm,
2565 "LINEOUT2P Driver"); 2568 "LINEOUT2P Driver");
2566 } 2569 }
2567 2570
2568 /* Do the sync with the old mode to allow it to clean up */ 2571 /* Do the sync with the old mode to allow it to clean up */
2569 snd_soc_dapm_sync(&codec->dapm); 2572 snd_soc_dapm_sync_unlocked(dapm);
2570 wm8994->vmid_mode = mode; 2573 wm8994->vmid_mode = mode;
2574
2575 snd_soc_dapm_mutex_unlock(dapm);
2571 break; 2576 break;
2572 2577
2573 case WM8994_VMID_FORCE: 2578 case WM8994_VMID_FORCE:
2579 snd_soc_dapm_mutex_lock(dapm);
2580
2574 if (wm8994->hubs.lineout1_se) { 2581 if (wm8994->hubs.lineout1_se) {
2575 snd_soc_dapm_force_enable_pin(&codec->dapm, 2582 snd_soc_dapm_force_enable_pin_unlocked(dapm,
2576 "LINEOUT1N Driver"); 2583 "LINEOUT1N Driver");
2577 snd_soc_dapm_force_enable_pin(&codec->dapm, 2584 snd_soc_dapm_force_enable_pin_unlocked(dapm,
2578 "LINEOUT1P Driver"); 2585 "LINEOUT1P Driver");
2579 } 2586 }
2580 if (wm8994->hubs.lineout2_se) { 2587 if (wm8994->hubs.lineout2_se) {
2581 snd_soc_dapm_force_enable_pin(&codec->dapm, 2588 snd_soc_dapm_force_enable_pin_unlocked(dapm,
2582 "LINEOUT2N Driver"); 2589 "LINEOUT2N Driver");
2583 snd_soc_dapm_force_enable_pin(&codec->dapm, 2590 snd_soc_dapm_force_enable_pin_unlocked(dapm,
2584 "LINEOUT2P Driver"); 2591 "LINEOUT2P Driver");
2585 } 2592 }
2586 2593
2587 wm8994->vmid_mode = mode; 2594 wm8994->vmid_mode = mode;
2588 snd_soc_dapm_sync(&codec->dapm); 2595 snd_soc_dapm_sync_unlocked(dapm);
2596
2597 snd_soc_dapm_mutex_unlock(dapm);
2589 break; 2598 break;
2590 2599
2591 default: 2600 default: