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

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.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent c7dab674
Loading
Loading
Loading
Loading
+22 −8
Original line number Diff line number Diff line
@@ -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,17 +2713,14 @@ 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"))
		rt5640->jd_inverted = true;