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 1bc40efdaf4a
("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: aab1ad11d69f ("ASoC: nau8821: new driver")
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://patch.msgid.link/20251003-nau8821-jdet-fixes-v1-4-f7b0e2543f09@collabora.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Cristian Ciocaltea 2025-10-03 21:03:26 +03:00 committed by Mark Brown
parent a698679fe8
commit 2b4eda7bf7
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

@ -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,9 +1178,10 @@ 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 */
regmap_update_bits(regmap, NAU8821_R0D_JACK_DET_CTRL,
NAU8821_JACK_DET_DB_BYPASS, 0);
/* 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);
/* Unmask & enable the ejection IRQs */
regmap_update_bits(regmap, NAU8821_R0F_INTERRUPT_MASK,
@ -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);