ASoC: rt5645: fix IRQ error in jack detection

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>
This commit is contained in:
John Lin 2015-05-12 20:43:04 +08:00 committed by Mark Brown
parent 47ba5bb295
commit b7f22478c0
1 changed files with 24 additions and 14 deletions

View 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;