]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: nau8821: Add DMI quirk to bypass jack debounce circuit
authorCristian Ciocaltea <cristian.ciocaltea@collabora.com>
Fri, 3 Oct 2025 18:03:26 +0000 (21:03 +0300)
committerMark Brown <broonie@kernel.org>
Mon, 13 Oct 2025 12:18:01 +0000 (13:18 +0100)
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>
sound/soc/codecs/nau8821.c

index 56e5a0d80782b85d8c256745911297f8edf5dd98..a8ff2ce70be9a94e7094696e06bda93f27fdea93 100644 (file)
@@ -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);