Commit 051dade3 authored by Oder Chiou's avatar Oder Chiou Committed by Mark Brown

ASoC: rt5640: Fix the wrong state of JD1 and JD2

The patch fixes the wrong state of JD1 and JD2 while the bst1 or bst2 is
power on in the HDA JD using.
Signed-off-by: default avatarOder Chiou <oder_chiou@realtek.com>
Reported-by: default avatarSameer Pujar <spujar@nvidia.com>
Link: https://lore.kernel.org/r/20220705101134.16792-1-oder_chiou@realtek.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent c7dab674
...@@ -1984,7 +1984,12 @@ static int rt5640_set_bias_level(struct snd_soc_component *component, ...@@ -1984,7 +1984,12 @@ static int rt5640_set_bias_level(struct snd_soc_component *component,
snd_soc_component_write(component, RT5640_PWR_DIG2, 0x0000); snd_soc_component_write(component, RT5640_PWR_DIG2, 0x0000);
snd_soc_component_write(component, RT5640_PWR_VOL, 0x0000); snd_soc_component_write(component, RT5640_PWR_VOL, 0x0000);
snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000); snd_soc_component_write(component, RT5640_PWR_MIXER, 0x0000);
snd_soc_component_write(component, RT5640_PWR_ANLG1, 0x0000); if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
snd_soc_component_write(component, RT5640_PWR_ANLG1,
0x0018);
else
snd_soc_component_write(component, RT5640_PWR_ANLG1,
0x0000);
snd_soc_component_write(component, RT5640_PWR_ANLG2, 0x0000); snd_soc_component_write(component, RT5640_PWR_ANLG2, 0x0000);
break; break;
...@@ -2393,9 +2398,15 @@ static void rt5640_jack_work(struct work_struct *work) ...@@ -2393,9 +2398,15 @@ static void rt5640_jack_work(struct work_struct *work)
static irqreturn_t rt5640_irq(int irq, void *data) static irqreturn_t rt5640_irq(int irq, void *data)
{ {
struct rt5640_priv *rt5640 = data; struct rt5640_priv *rt5640 = data;
int delay = 0;
if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
cancel_delayed_work_sync(&rt5640->jack_work);
delay = 100;
}
if (rt5640->jack) if (rt5640->jack)
queue_delayed_work(system_long_wq, &rt5640->jack_work, 0); queue_delayed_work(system_long_wq, &rt5640->jack_work, delay);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -2580,6 +2591,12 @@ static void rt5640_enable_hda_jack_detect( ...@@ -2580,6 +2591,12 @@ static void rt5640_enable_hda_jack_detect(
snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x400, 0x0); snd_soc_component_update_bits(component, RT5640_DUMMY1, 0x400, 0x0);
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
RT5640_PWR_VREF2, RT5640_PWR_VREF2);
usleep_range(10000, 15000);
snd_soc_component_update_bits(component, RT5640_PWR_ANLG1,
RT5640_PWR_FV2, RT5640_PWR_FV2);
rt5640->jack = jack; rt5640->jack = jack;
ret = request_irq(rt5640->irq, rt5640_irq, ret = request_irq(rt5640->irq, rt5640_irq,
...@@ -2696,16 +2713,13 @@ static int rt5640_probe(struct snd_soc_component *component) ...@@ -2696,16 +2713,13 @@ static int rt5640_probe(struct snd_soc_component *component)
if (device_property_read_u32(component->dev, if (device_property_read_u32(component->dev,
"realtek,jack-detect-source", &val) == 0) { "realtek,jack-detect-source", &val) == 0) {
if (val <= RT5640_JD_SRC_GPIO4) { if (val <= RT5640_JD_SRC_GPIO4)
rt5640->jd_src = val << RT5640_JD_SFT; rt5640->jd_src = val << RT5640_JD_SFT;
} else if (val == RT5640_JD_SRC_HDA_HEADER) { else if (val == RT5640_JD_SRC_HDA_HEADER)
rt5640->jd_src = RT5640_JD_SRC_HDA_HEADER; rt5640->jd_src = RT5640_JD_SRC_HDA_HEADER;
snd_soc_component_update_bits(component, RT5640_DUMMY1, else
0x0300, 0x0);
} else {
dev_warn(component->dev, "Warning: Invalid jack-detect-source value: %d, leaving jack-detect disabled\n", dev_warn(component->dev, "Warning: Invalid jack-detect-source value: %d, leaving jack-detect disabled\n",
val); val);
}
} }
if (!device_property_read_bool(component->dev, "realtek,jack-detect-not-inverted")) if (!device_property_read_bool(component->dev, "realtek,jack-detect-not-inverted"))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment