Unverified Commit 2b4eda7b authored by Cristian Ciocaltea's avatar Cristian Ciocaltea Committed by Mark Brown
Browse files

ASoC: nau8821: Add DMI quirk to bypass jack debounce circuit



Stress testing the audio jack hotplug handling on a few Steam Deck units
revealed that the debounce circuit is responsible for having a negative
impact on the detection reliability, e.g. in some cases the ejection
interrupt is not fired, while in other instances it goes into a kind of
invalid state and generates a flood of misleading interrupts.

Add new entries to the DMI table introduced via commit 1bc40efd
("ASoC: nau8821: Add DMI quirk mechanism for active-high jack-detect")
and extend the quirk logic to allow bypassing the debounce circuit used
for jack detection on Valve Steam Deck LCD and OLED models.

While at it, rename existing NAU8821_JD_ACTIVE_HIGH quirk bitfield to
NAU8821_QUIRK_JD_ACTIVE_HIGH.  This should help improve code readability
by differentiating from similarly named register bits.

Fixes: aab1ad11 ("ASoC: nau8821: new driver")
Signed-off-by: default avatarCristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://patch.msgid.link/20251003-nau8821-jdet-fixes-v1-4-f7b0e2543f09@collabora.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a698679f
Loading
Loading
Loading
Loading
+27 −6
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@
#include <sound/tlv.h>
#include "nau8821.h"

#define NAU8821_JD_ACTIVE_HIGH			BIT(0)
#define NAU8821_QUIRK_JD_ACTIVE_HIGH			BIT(0)
#define NAU8821_QUIRK_JD_DB_BYPASS			BIT(1)

static int nau8821_quirk;
static int quirk_override = -1;
@@ -1177,7 +1178,8 @@ static void nau8821_setup_inserted_irq(struct nau8821 *nau8821)
	regmap_update_bits(regmap, NAU8821_R1D_I2S_PCM_CTRL2,
		NAU8821_I2S_MS_MASK, NAU8821_I2S_MS_SLAVE);

	/* Not bypass de-bounce circuit */
	/* Do not bypass de-bounce circuit */
	if (!(nau8821_quirk & NAU8821_QUIRK_JD_DB_BYPASS))
		regmap_update_bits(regmap, NAU8821_R0D_JACK_DET_CTRL,
				   NAU8821_JACK_DET_DB_BYPASS, 0);

@@ -1864,7 +1866,23 @@ static const struct dmi_system_id nau8821_quirk_table[] = {
			DMI_MATCH(DMI_SYS_VENDOR, "Positivo Tecnologia SA"),
			DMI_MATCH(DMI_BOARD_NAME, "CW14Q01P-V2"),
		},
		.driver_data = (void *)(NAU8821_JD_ACTIVE_HIGH),
		.driver_data = (void *)(NAU8821_QUIRK_JD_ACTIVE_HIGH),
	},
	{
		/* Valve Steam Deck LCD */
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
			DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"),
		},
		.driver_data = (void *)(NAU8821_QUIRK_JD_DB_BYPASS),
	},
	{
		/* Valve Steam Deck OLED */
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Valve"),
			DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"),
		},
		.driver_data = (void *)(NAU8821_QUIRK_JD_DB_BYPASS),
	},
	{}
};
@@ -1906,9 +1924,12 @@ static int nau8821_i2c_probe(struct i2c_client *i2c)

	nau8821_check_quirks();

	if (nau8821_quirk & NAU8821_JD_ACTIVE_HIGH)
	if (nau8821_quirk & NAU8821_QUIRK_JD_ACTIVE_HIGH)
		nau8821->jkdet_polarity = 0;

	if (nau8821_quirk & NAU8821_QUIRK_JD_DB_BYPASS)
		dev_dbg(dev, "Force bypassing jack detection debounce circuit\n");

	nau8821_print_device_properties(nau8821);

	nau8821_reset_chip(nau8821->regmap);