Merge remote-tracking branches 'asoc/topic/rl6231', 'asoc/topic/rl6347a', 'asoc/topic...
[linux-2.6-microblaze.git] / sound / soc / codecs / rt298.c
index 5555864..7150a40 100644 (file)
@@ -249,6 +249,11 @@ static int rt298_jack_detect(struct rt298_priv *rt298, bool *hp, bool *mic)
                        snd_soc_dapm_force_enable_pin(dapm, "LDO1");
                        snd_soc_dapm_sync(dapm);
 
+                       regmap_update_bits(rt298->regmap,
+                               RT298_POWER_CTRL1, 0x1001, 0);
+                       regmap_update_bits(rt298->regmap,
+                               RT298_POWER_CTRL2, 0x4, 0x4);
+
                        regmap_write(rt298->regmap, RT298_SET_MIC1, 0x24);
                        msleep(50);
 
@@ -321,11 +326,31 @@ static void rt298_jack_detect_work(struct work_struct *work)
 int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
 {
        struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_dapm_context *dapm;
+       bool hp = false;
+       bool mic = false;
+       int status = 0;
+
+       /* If jack in NULL, disable HS jack */
+       if (!jack) {
+               regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x0);
+               dapm = snd_soc_codec_get_dapm(codec);
+               snd_soc_dapm_disable_pin(dapm, "LDO1");
+               snd_soc_dapm_sync(dapm);
+               return 0;
+       }
 
        rt298->jack = jack;
+       regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x2);
+
+       rt298_jack_detect(rt298, &hp, &mic);
+       if (hp == true)
+               status |= SND_JACK_HEADPHONE;
 
-       /* Send an initial empty report */
-       snd_soc_jack_report(rt298->jack, 0,
+       if (mic == true)
+               status |= SND_JACK_MICROPHONE;
+
+       snd_soc_jack_report(rt298->jack, status,
                SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
 
        return 0;