ASoC: rt5663: Optimize the Jack Type detection
authoroder_chiou@realtek.com <oder_chiou@realtek.com>
Fri, 7 Jul 2017 08:58:58 +0000 (16:58 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 17 Jul 2017 11:05:53 +0000 (12:05 +0100)
The patch optimizes the Jack Type detection.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5663.c

index 18b3b526b7c5996cb8e13f003a74b81a57a5333f..ebd9ae00e04d2b88d2ca031fe385d43910390ef0 100644 (file)
@@ -1508,7 +1508,7 @@ static int rt5663_v2_jack_detect(struct snd_soc_codec *codec, int jack_insert)
 static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert)
 {
        struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec);
-       int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30};
+       int val, i = 0;
 
        dev_dbg(codec->dev, "%s jack_insert:%d\n", __func__, jack_insert);
 
@@ -1543,17 +1543,22 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert)
                        RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN);
                snd_soc_update_bits(codec, RT5663_IRQ_1,
                        RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN);
-               while (i < 5) {
-                       msleep(sleep_time[i]);
-                       val = snd_soc_read(codec, RT5663_EM_JACK_TYPE_2) &
-                               0x0003;
-                       dev_dbg(codec->dev, "%s: MX-00e7 val=%x sleep %d\n",
-                               __func__, val, sleep_time[i]);
-                       i++;
-                       if (val == 0x1 || val == 0x2 || val == 0x3)
+
+               while (true) {
+                       regmap_read(rt5663->regmap, RT5663_INT_ST_2, &val);
+                       if (!(val & 0x80))
+                               usleep_range(10000, 10005);
+                       else
+                               break;
+
+                       if (i > 200)
                                break;
+                       i++;
                }
+
+               val = snd_soc_read(codec, RT5663_EM_JACK_TYPE_2) & 0x0003;
                dev_dbg(codec->dev, "%s val = %d\n", __func__, val);
+
                switch (val) {
                case 1:
                case 2: