Skip to content

Commit

Permalink
ASoC: rt5640: Fix the wrong state of JD1 and JD2
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oder Chiou authored and Mark Brown committed Jul 7, 2022
1 parent c7dab67 commit 051dade
Showing 1 changed file with 22 additions and 8 deletions.
30 changes: 22 additions & 8 deletions sound/soc/codecs/rt5640.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_VOL, 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);
break;

Expand Down Expand Up @@ -2393,9 +2398,15 @@ static void rt5640_jack_work(struct work_struct *work)
static irqreturn_t rt5640_irq(int irq, void *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)
queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
queue_delayed_work(system_long_wq, &rt5640->jack_work, delay);

return IRQ_HANDLED;
}
Expand Down Expand Up @@ -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_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;

ret = request_irq(rt5640->irq, rt5640_irq,
Expand Down Expand Up @@ -2696,16 +2713,13 @@ static int rt5640_probe(struct snd_soc_component *component)

if (device_property_read_u32(component->dev,
"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;
} else if (val == RT5640_JD_SRC_HDA_HEADER) {
else if (val == RT5640_JD_SRC_HDA_HEADER)
rt5640->jd_src = RT5640_JD_SRC_HDA_HEADER;
snd_soc_component_update_bits(component, RT5640_DUMMY1,
0x0300, 0x0);
} else {
else
dev_warn(component->dev, "Warning: Invalid jack-detect-source value: %d, leaving jack-detect disabled\n",
val);
}
}

if (!device_property_read_bool(component->dev, "realtek,jack-detect-not-inverted"))
Expand Down

0 comments on commit 051dade

Please sign in to comment.