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:
parent
a698679fe8
commit
2b4eda7bf7
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user