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: Oder Chiou <oder_chiou@realtek.com>
Reported-by: Sameer Pujar <spujar@nvidia.com>
Link: https://lore.kernel.org/r/20220705101134.16792-1-oder_chiou@realtek.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Oder Chiou 2022-07-05 18:11:33 +08:00 committed by Mark Brown
parent c7dab6745f
commit 051dade346
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -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)
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(
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,17 +2713,14 @@ 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"))
rt5640->jd_inverted = true; rt5640->jd_inverted = true;