mirror of
https://github.com/torvalds/linux
synced 2024-11-02 18:48:59 +00:00
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:
parent
c7dab6745f
commit
051dade346
1 changed files with 22 additions and 8 deletions
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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"))
|
||||
|
|
Loading…
Reference in a new issue