ASoC: rt5645: fix IRQ error in jack detection
authorJohn Lin <john.lin@realtek.com>
Tue, 12 May 2015 12:43:04 +0000 (20:43 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 12 May 2015 18:50:40 +0000 (19:50 +0100)
IRQ of jack and button detection is abnormal if "LDO2" and
"Mic Det Power" power disable in rt5645_jack_detect.
This patch make these two power keep enabled until jack out.

Signed-off-by: John Lin <john.lin@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5645.c

index 0571a60..e62f3b2 100644 (file)
@@ -2827,20 +2827,6 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
                val = snd_soc_read(codec, RT5645_IN1_CTRL3) & 0x7;
                dev_dbg(codec->dev, "val = %d\n", val);
 
-               if (codec->component.card->instantiated) {
-                       if (rt5645->pdata.jd_mode == 0)
-                               snd_soc_dapm_disable_pin(&codec->dapm, "LDO2");
-                       snd_soc_dapm_disable_pin(&codec->dapm,
-                               "Mic Det Power");
-                       snd_soc_dapm_sync(&codec->dapm);
-               } else {
-                       if (rt5645->pdata.jd_mode == 0)
-                               snd_soc_update_bits(codec, RT5645_PWR_MIXER,
-                                       RT5645_PWR_LDO2, 0);
-                       snd_soc_update_bits(codec, RT5645_PWR_VOL,
-                               RT5645_PWR_MIC_DET, 0);
-               }
-
                if (val == 1 || val == 2) {
                        rt5645->jack_type = SND_JACK_HEADSET;
                        if (rt5645->en_button_func) {
@@ -2848,6 +2834,13 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
                                rt5645_enable_push_button_irq(codec, true);
                        }
                } else {
+                       if (codec->component.card->instantiated) {
+                               snd_soc_dapm_disable_pin(&codec->dapm,
+                                       "Mic Det Power");
+                               snd_soc_dapm_sync(&codec->dapm);
+                       } else
+                               regmap_update_bits(rt5645->regmap,
+                                       RT5645_PWR_VOL, RT5645_PWR_MIC_DET, 0);
                        rt5645->jack_type = SND_JACK_HEADPHONE;
                }
 
@@ -2855,6 +2848,23 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
                rt5645->jack_type = 0;
                if (rt5645->en_button_func)
                        rt5645_enable_push_button_irq(codec, false);
+               else {
+                       if (codec->component.card->instantiated) {
+                               if (rt5645->pdata.jd_mode == 0)
+                                       snd_soc_dapm_disable_pin(&codec->dapm,
+                                               "LDO2");
+                               snd_soc_dapm_disable_pin(&codec->dapm,
+                                       "Mic Det Power");
+                               snd_soc_dapm_sync(&codec->dapm);
+                       } else {
+                               if (rt5645->pdata.jd_mode == 0)
+                                       regmap_update_bits(rt5645->regmap,
+                                               RT5645_PWR_MIXER,
+                                               RT5645_PWR_LDO2, 0);
+                               regmap_update_bits(rt5645->regmap,
+                                       RT5645_PWR_VOL, RT5645_PWR_MIC_DET, 0);
+                       }
+               }
        }
 
        return rt5645->jack_type;