aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-03-03 15:02:49 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-03-03 20:59:01 -0500
commit1defde2a50f9171e665cc8f4c46fe48e86bb364e (patch)
tree973c41548fe3b48a7bc9438310140e6d27682ab7
parent28e33269a71cb4104c2e0629b6a3ef7344436f93 (diff)
ASoC: wm8994: Factor out WM1811A detection mode setting
Push everything through one function for active use cases, should be no practical effect. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/codecs/wm8994.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index bda5ddbeecb4..2417ef9316ed 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -685,6 +685,8 @@ SOC_SINGLE_TLV("MIXINL IN1RP Boost Volume", WM8994_INPUT_MIXER_1, 8, 1, 0,
685static void wm1811_jackdet_set_mode(struct snd_soc_codec *codec, u16 mode) 685static void wm1811_jackdet_set_mode(struct snd_soc_codec *codec, u16 mode)
686{ 686{
687 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); 687 struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
688 u16 old = snd_soc_read(codec, WM8994_ANTIPOP_2)
689 & WM1811_JACKDET_MODE_MASK;
688 690
689 if (!wm8994->jackdet || !wm8994->jack_cb) 691 if (!wm8994->jackdet || !wm8994->jack_cb)
690 return; 692 return;
@@ -692,11 +694,28 @@ static void wm1811_jackdet_set_mode(struct snd_soc_codec *codec, u16 mode)
692 if (wm8994->active_refcount) 694 if (wm8994->active_refcount)
693 mode = WM1811_JACKDET_MODE_AUDIO; 695 mode = WM1811_JACKDET_MODE_AUDIO;
694 696
697 if (mode == old)
698 return;
699
695 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, 700 snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
696 WM1811_JACKDET_MODE_MASK, mode); 701 WM1811_JACKDET_MODE_MASK, mode);
697 702
698 if (mode == WM1811_JACKDET_MODE_MIC) 703 switch (mode) {
699 msleep(2); 704 case WM1811_JACKDET_MODE_MIC:
705 case WM1811_JACKDET_MODE_AUDIO:
706 switch (old) {
707 case WM1811_JACKDET_MODE_MIC:
708 case WM1811_JACKDET_MODE_AUDIO:
709 break;
710 default:
711 msleep(2);
712 break;
713 }
714
715 default:
716 break;
717 }
718
700} 719}
701 720
702static void active_reference(struct snd_soc_codec *codec) 721static void active_reference(struct snd_soc_codec *codec)
@@ -710,15 +729,8 @@ static void active_reference(struct snd_soc_codec *codec)
710 dev_dbg(codec->dev, "Active refcount incremented, now %d\n", 729 dev_dbg(codec->dev, "Active refcount incremented, now %d\n",
711 wm8994->active_refcount); 730 wm8994->active_refcount);
712 731
713 if (wm8994->active_refcount == 1) { 732 /* If we're using jack detection go into audio mode */
714 /* If we're using jack detection go into audio mode */ 733 wm1811_jackdet_set_mode(codec, WM1811_JACKDET_MODE_AUDIO);
715 if (wm8994->jackdet && wm8994->jack_cb) {
716 snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
717 WM1811_JACKDET_MODE_MASK,
718 WM1811_JACKDET_MODE_AUDIO);
719 msleep(2);
720 }
721 }
722 734
723 mutex_unlock(&wm8994->accdet_lock); 735 mutex_unlock(&wm8994->accdet_lock);
724} 736}
@@ -737,16 +749,12 @@ static void active_dereference(struct snd_soc_codec *codec)
737 749
738 if (wm8994->active_refcount == 0) { 750 if (wm8994->active_refcount == 0) {
739 /* Go into appropriate detection only mode */ 751 /* Go into appropriate detection only mode */
740 if (wm8994->jackdet && wm8994->jack_cb) { 752 if (wm8994->jack_mic || wm8994->mic_detecting)
741 if (wm8994->jack_mic || wm8994->mic_detecting) 753 mode = WM1811_JACKDET_MODE_MIC;
742 mode = WM1811_JACKDET_MODE_MIC; 754 else
743 else 755 mode = WM1811_JACKDET_MODE_JACK;
744 mode = WM1811_JACKDET_MODE_JACK;
745 756
746 snd_soc_update_bits(codec, WM8994_ANTIPOP_2, 757 wm1811_jackdet_set_mode(codec, mode);
747 WM1811_JACKDET_MODE_MASK,
748 mode);
749 }
750 } 758 }
751 759
752 mutex_unlock(&wm8994->accdet_lock); 760 mutex_unlock(&wm8994->accdet_lock);