From nobody Wed Dec 17 17:47:27 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 488C52D47E6; Fri, 3 Oct 2025 18:03:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514612; cv=none; b=EYvc1uY/sHMCT3Ve6g1BLCigsmJWKaYAAGCjAiXKrai4F+YFHlvZGUm8y+nXQkm4GNL8gXe1HeOi9idmLWq3eynAEjakKvKlrlwRhl4Uv1mROyUzKYZYVHmke94WxdnwGWm6onP0IWfvN+DdZzBhHYta7r4yhTFLbs4n97aXKHY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514612; c=relaxed/simple; bh=GV/xLeikzitu0xIP/oUS/Qla+TzEuIi496JxSHqMe6I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mRnjJx9B4n0W3Pn6CBzbEOEa/D1ZC8Z92EYrU7KjFAvCI9zLP5Q/SZPXjeutDwbJXIwB+JWzv8N6A/2gt7yG34ruTEN/jbkwfzRC4ZiR7hTtHEiQv6ZV1OovpVLy1claf0tYM13aEUtoK8vEmyKXrEPoGDSuwxsSK/0EaFVM08Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=RtJSKRZq; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="RtJSKRZq" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759514608; bh=GV/xLeikzitu0xIP/oUS/Qla+TzEuIi496JxSHqMe6I=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RtJSKRZqI9xEg3W1ftPPYDW1J2LI6scpGhQGBWvnbhR65yZtZG7jXjGm6kpxl/OL6 thF0JtpDiONRYUWFdWxLl3nOcISrQraWlqgGNH91XaKY6SQGWJFo0MbWMPZkKZAttl s9hnSsM3AL4e32uEFf62Cf3mhjMDI/EjRFjRkxNB00P4bRVIcWNLfMTLh4KIajiW+Q LkEBDhNePdZ4ZOhaFmJ4gmG/4PdX+aeAzgsJw/IwsZT6NsoH4OeD6+84alHdHH2eAR gZGI7DpscEz94vhtgvKw1ODRfsHbt2sGd31PIWCMiha24xsNBIy4pRB1FzGh/508Ky e5B94WMDxjgOg== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with UTF8SMTPSA id 5B77017E12F7; Fri, 3 Oct 2025 20:03:28 +0200 (CEST) From: Cristian Ciocaltea Date: Fri, 03 Oct 2025 21:03:23 +0300 Subject: [PATCH 1/5] ASoC: nau8821: Cancel jdet_work before handling jack ejection Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251003-nau8821-jdet-fixes-v1-1-f7b0e2543f09@collabora.com> References: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> In-Reply-To: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Seven Lee Cc: kernel@collabora.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 The microphone detection work scheduled by a prior jack insertion interrupt may still be in a pending state or under execution when a jack ejection interrupt has been fired. This might lead to a racing condition or nau8821_jdet_work() completing after nau8821_eject_jack(), which will override the currently disconnected state of the jack and incorrectly report the headphone or the headset as being connected. Cancel any pending jdet_work or wait for its execution to finish before attempting to handle the ejection interrupt. Proceed similarly before launching the eject handler as a consequence of detecting an invalid insert interrupt. Fixes: aab1ad11d69f ("ASoC: nau8821: new driver") Signed-off-by: Cristian Ciocaltea --- sound/soc/codecs/nau8821.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sound/soc/codecs/nau8821.c b/sound/soc/codecs/nau8821.c index edb95f869a4a6ba63622b2d27d7b359c6aeea5ef..fed5d51fa5c3b4ea6060cc3b828= 7261d7509e225 100644 --- a/sound/soc/codecs/nau8821.c +++ b/sound/soc/codecs/nau8821.c @@ -1185,6 +1185,7 @@ static irqreturn_t nau8821_interrupt(int irq, void *d= ata) =20 if ((active_irq & NAU8821_JACK_EJECT_IRQ_MASK) =3D=3D NAU8821_JACK_EJECT_DETECTED) { + cancel_work_sync(&nau8821->jdet_work); regmap_update_bits(regmap, NAU8821_R71_ANALOG_ADC_1, NAU8821_MICDET_MASK, NAU8821_MICDET_DIS); nau8821_eject_jack(nau8821); @@ -1199,11 +1200,11 @@ static irqreturn_t nau8821_interrupt(int irq, void = *data) clear_irq =3D NAU8821_KEY_RELEASE_IRQ; } else if ((active_irq & NAU8821_JACK_INSERT_IRQ_MASK) =3D=3D NAU8821_JACK_INSERT_DETECTED) { + cancel_work_sync(&nau8821->jdet_work); regmap_update_bits(regmap, NAU8821_R71_ANALOG_ADC_1, NAU8821_MICDET_MASK, NAU8821_MICDET_EN); if (nau8821_is_jack_inserted(regmap)) { /* detect microphone and jack type */ - cancel_work_sync(&nau8821->jdet_work); schedule_work(&nau8821->jdet_work); /* Turn off insertion interruption at manual mode */ regmap_update_bits(regmap, --=20 2.51.0 From nobody Wed Dec 17 17:47:27 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 19C66381BA; Fri, 3 Oct 2025 18:03:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514612; cv=none; b=qoB5JZqKErJjb3PHYwAagk1U2dopUl4uIRvp/PfKonXAGYCrvSBr1aEM4R0URO2BHExeiC4ifP3CvPTB0ODPfjRTEKMjvCNNKM7XpPYnXHweUimaRv19qsBMI0vXucEE/lXgsL5CEEDPDNDKX8i9+N8h+lrCip7/ExHZzYY5gTw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514612; c=relaxed/simple; bh=1Ot6z9hO//qEEGRqMoDJT+qBc+H1lWRc/pl1r7YqdDY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d4SfVPMCKWoAXWN1KVgucaIyz5row4KxAM+SHwPiWrINCfke4hbd0Nuje0lJPCN3ec4+gTyw4ytDwTnKq/0ME4ooJJj2T/6UxFy9pENq2klxBbuHle8RNvMpUcGacRrORV6Mcg7heleM4skyhMs3Yr6OULTNKtZZLdorg+a0Zfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Jjm0gcxj; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Jjm0gcxj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759514609; bh=1Ot6z9hO//qEEGRqMoDJT+qBc+H1lWRc/pl1r7YqdDY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Jjm0gcxjFD9xbjCgclwu/DIiXhF3x2g1nsydvr7JNV0a3acaBG7a3KowD+3TFAi85 I0Aos/uBTISAt/oMA0TAKKyghYWjfs4cmqa0WgInziKR0Cj/Qg69ARM1EdPhjwoQvf /BaIb5mTpVMSukY/o65dM2OhBrKOBZO8LnbQlTNh5lU0N2asx/po7tWY8XjxJ8/BHt ck8WMJmndw0VJrYG/2CcvHjZp274NW2zLUeyisaPvjyGbBjkejFdoIoL+ifWG0ih52 gBiaEXhN4SFQUGUNz3S2YL1y6vod8vFrWo53sd/Tsjuk522/jpNUYb0DKZWUWYiuwP pCMY/PK8pVl4Q== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with UTF8SMTPSA id 2CDB017E137E; Fri, 3 Oct 2025 20:03:29 +0200 (CEST) From: Cristian Ciocaltea Date: Fri, 03 Oct 2025 21:03:24 +0300 Subject: [PATCH 2/5] ASoC: nau8821: Generalize helper to clear IRQ status Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251003-nau8821-jdet-fixes-v1-2-f7b0e2543f09@collabora.com> References: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> In-Reply-To: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Seven Lee Cc: kernel@collabora.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Instead of adding yet another utility function for dealing with the interrupt clearing register, generalize nau8821_int_status_clear_all() by renaming it to nau8821_irq_status_clear(), whilst introducing a second parameter to allow restricting the operation scope to a single interrupt instead of the whole range of active IRQs. While at it, also fix a spelling typo in the comment block. Note this is mainly a prerequisite for subsequent patches aiming to address some deficiencies in the implementation of the interrupt handler. Thus the presence of the Fixes tag below is intentional, to facilitate backporting. Fixes: aab1ad11d69f ("ASoC: nau8821: new driver") Signed-off-by: Cristian Ciocaltea --- sound/soc/codecs/nau8821.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/sound/soc/codecs/nau8821.c b/sound/soc/codecs/nau8821.c index fed5d51fa5c3b4ea6060cc3b8287261d7509e225..cefce97893123462198c2e66d1d= e9d06e4d3dd28 100644 --- a/sound/soc/codecs/nau8821.c +++ b/sound/soc/codecs/nau8821.c @@ -1021,12 +1021,17 @@ static bool nau8821_is_jack_inserted(struct regmap = *regmap) return active_high =3D=3D is_high; } =20 -static void nau8821_int_status_clear_all(struct regmap *regmap) +static void nau8821_irq_status_clear(struct regmap *regmap, int active_irq) { - int active_irq, clear_irq, i; + int clear_irq, i; =20 - /* Reset the intrruption status from rightmost bit if the corres- - * ponding irq event occurs. + if (active_irq) { + regmap_write(regmap, NAU8821_R11_INT_CLR_KEY_STATUS, active_irq); + return; + } + + /* Reset the interruption status from rightmost bit if the + * corresponding irq event occurs. */ regmap_read(regmap, NAU8821_R10_IRQ_STATUS, &active_irq); for (i =3D 0; i < NAU8821_REG_DATA_LEN; i++) { @@ -1053,7 +1058,7 @@ static void nau8821_eject_jack(struct nau8821 *nau882= 1) snd_soc_dapm_sync(dapm); =20 /* Clear all interruption status */ - nau8821_int_status_clear_all(regmap); + nau8821_irq_status_clear(regmap, 0); =20 /* Enable the insertion interruption, disable the ejection inter- * ruption, and then bypass de-bounce circuit. @@ -1522,7 +1527,7 @@ static int nau8821_resume_setup(struct nau8821 *nau88= 21) nau8821_configure_sysclk(nau8821, NAU8821_CLK_DIS, 0); if (nau8821->irq) { /* Clear all interruption status */ - nau8821_int_status_clear_all(regmap); + nau8821_irq_status_clear(regmap, 0); =20 /* Enable both insertion and ejection interruptions, and then * bypass de-bounce circuit. --=20 2.51.0 From nobody Wed Dec 17 17:47:27 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B65422DCF4C; Fri, 3 Oct 2025 18:03:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514614; cv=none; b=Me3O2nwm+EQUrPIO7ayuu2bI6PHYQkk0MbKbsLayBXE3rhNwx65WmDWyF63gPPHos3eY93/Nw1sbtdUTBsigO7laVI2STrzI1bH9pYOSXcoy/h676X92NdUoDBcbUghTY7D/LUBjwYWOXyTrqFxlPoajv6dvfKWmv4tO4gxLIrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514614; c=relaxed/simple; bh=JUPIQ0qb6eHCy9cI1y2tcCx0EM4NF0PNR9hoEG1qjMw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CdD79YRKIkdPHPY4crE8RtpGgIUY8gVuMZJxOdKiWvy9sxm1j0IMW3zZE3bP3X3qblCXtgmoCUAnAGkY28pKN5eSo4XWnxSV6a6MMewDUo4pfyF+ZScyfTJ3l1B++PbI810vpiIGIiSrkfCjErqc7YZ0L1swidEfdMFx/0ceTj0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=IrkBkybK; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="IrkBkybK" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759514610; bh=JUPIQ0qb6eHCy9cI1y2tcCx0EM4NF0PNR9hoEG1qjMw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=IrkBkybKCYvYPT7sINzfH29CMUEjqWeURnjw4uaUfDK4MJwY9y+UlD2eOzkkMNlPF T0Wnr1V6XFfMuS5Cctjo9U0zlH2EQlIx11eSZIY6Rx0xSNHM8PjocrviDaGEHOU+Rb WEhwFRSKIICLC7+cNPTkMlO+dhvE7uhwq6DXnDapVi/P+uJaDELHiTcx9BGgkOpm5+ +G01c4uO1jfUWMQgPBJVOYcFaXbZv2GB3SZ5tAp/U5ZDFipWYHEM1p2wNkLjmOFiLv e260QIiGL1OLCrHuEXpY1YPjThGeVzNrjdm0riWPiMOre1nR0C6YRKKfCDw5sn0jtF p3uFhG3usYQyg== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with UTF8SMTPSA id EF6A817E13B9; Fri, 3 Oct 2025 20:03:29 +0200 (CEST) From: Cristian Ciocaltea Date: Fri, 03 Oct 2025 21:03:25 +0300 Subject: [PATCH 3/5] ASoC: nau8821: Consistently clear interrupts before unmasking Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251003-nau8821-jdet-fixes-v1-3-f7b0e2543f09@collabora.com> References: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> In-Reply-To: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Seven Lee Cc: kernel@collabora.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 The interrupt handler attempts to perform some IRQ status clear operations *after* rather than *before* unmasking and enabling interrupts. This is a rather fragile approach since it may generally lead to missing IRQ requests or causing spurious interrupts. Make use of the nau8821_irq_status_clear() helper instead of manipulating the related register directly and ensure any interrupt clearing is performed *after* the target interrupts are disabled/masked and *before* proceeding with additional interrupt unmasking/enablement operations. This also implicitly drops the redundant clear operation of the ejection IRQ in the interrupt handler, since nau8821_eject_jack() has been already responsible for clearing all active interrupts. Fixes: aab1ad11d69f ("ASoC: nau8821: new driver") Fixes: 2551b6e89936 ("ASoC: nau8821: Add headset button detection") Signed-off-by: Cristian Ciocaltea --- sound/soc/codecs/nau8821.c | 58 ++++++++++++++++++++++++------------------= ---- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/sound/soc/codecs/nau8821.c b/sound/soc/codecs/nau8821.c index cefce97893123462198c2e66d1de9d06e4d3dd28..56e5a0d80782b85d8c256745911= 297f8edf5dd98 100644 --- a/sound/soc/codecs/nau8821.c +++ b/sound/soc/codecs/nau8821.c @@ -1057,20 +1057,24 @@ static void nau8821_eject_jack(struct nau8821 *nau8= 821) snd_soc_component_disable_pin(component, "MICBIAS"); snd_soc_dapm_sync(dapm); =20 + /* Disable & mask both insertion & ejection IRQs */ + regmap_update_bits(regmap, NAU8821_R12_INTERRUPT_DIS_CTRL, + NAU8821_IRQ_INSERT_DIS | NAU8821_IRQ_EJECT_DIS, + NAU8821_IRQ_INSERT_DIS | NAU8821_IRQ_EJECT_DIS); + regmap_update_bits(regmap, NAU8821_R0F_INTERRUPT_MASK, + NAU8821_IRQ_INSERT_EN | NAU8821_IRQ_EJECT_EN, + NAU8821_IRQ_INSERT_EN | NAU8821_IRQ_EJECT_EN); + /* Clear all interruption status */ nau8821_irq_status_clear(regmap, 0); =20 - /* Enable the insertion interruption, disable the ejection inter- - * ruption, and then bypass de-bounce circuit. - */ + /* Enable & unmask the insertion IRQ */ regmap_update_bits(regmap, NAU8821_R12_INTERRUPT_DIS_CTRL, - NAU8821_IRQ_EJECT_DIS | NAU8821_IRQ_INSERT_DIS, - NAU8821_IRQ_EJECT_DIS); - /* Mask unneeded IRQs: 1 - disable, 0 - enable */ + NAU8821_IRQ_INSERT_DIS, 0); regmap_update_bits(regmap, NAU8821_R0F_INTERRUPT_MASK, - NAU8821_IRQ_EJECT_EN | NAU8821_IRQ_INSERT_EN, - NAU8821_IRQ_EJECT_EN); + NAU8821_IRQ_INSERT_EN, 0); =20 + /* Bypass de-bounce circuit */ regmap_update_bits(regmap, NAU8821_R0D_JACK_DET_CTRL, NAU8821_JACK_DET_DB_BYPASS, NAU8821_JACK_DET_DB_BYPASS); =20 @@ -1094,7 +1098,6 @@ static void nau8821_eject_jack(struct nau8821 *nau882= 1) NAU8821_IRQ_KEY_RELEASE_DIS | NAU8821_IRQ_KEY_PRESS_DIS); } - } =20 static void nau8821_jdet_work(struct work_struct *work) @@ -1151,6 +1154,15 @@ static void nau8821_setup_inserted_irq(struct nau882= 1 *nau8821) { struct regmap *regmap =3D nau8821->regmap; =20 + /* Disable & mask insertion IRQ */ + regmap_update_bits(regmap, NAU8821_R12_INTERRUPT_DIS_CTRL, + NAU8821_IRQ_INSERT_DIS, NAU8821_IRQ_INSERT_DIS); + regmap_update_bits(regmap, NAU8821_R0F_INTERRUPT_MASK, + NAU8821_IRQ_INSERT_EN, NAU8821_IRQ_INSERT_EN); + + /* Clear insert IRQ status */ + nau8821_irq_status_clear(regmap, NAU8821_JACK_INSERT_DETECTED); + /* Enable internal VCO needed for interruptions */ if (nau8821->dapm->bias_level < SND_SOC_BIAS_PREPARE) nau8821_configure_sysclk(nau8821, NAU8821_CLK_INTERNAL, 0); @@ -1169,17 +1181,18 @@ static void nau8821_setup_inserted_irq(struct nau88= 21 *nau8821) regmap_update_bits(regmap, NAU8821_R0D_JACK_DET_CTRL, NAU8821_JACK_DET_DB_BYPASS, 0); =20 + /* Unmask & enable the ejection IRQs */ regmap_update_bits(regmap, NAU8821_R0F_INTERRUPT_MASK, - NAU8821_IRQ_EJECT_EN, 0); + NAU8821_IRQ_EJECT_EN, 0); regmap_update_bits(regmap, NAU8821_R12_INTERRUPT_DIS_CTRL, - NAU8821_IRQ_EJECT_DIS, 0); + NAU8821_IRQ_EJECT_DIS, 0); } =20 static irqreturn_t nau8821_interrupt(int irq, void *data) { struct nau8821 *nau8821 =3D (struct nau8821 *)data; struct regmap *regmap =3D nau8821->regmap; - int active_irq, clear_irq =3D 0, event =3D 0, event_mask =3D 0; + int active_irq, event =3D 0, event_mask =3D 0; =20 if (regmap_read(regmap, NAU8821_R10_IRQ_STATUS, &active_irq)) { dev_err(nau8821->dev, "failed to read irq status\n"); @@ -1195,14 +1208,13 @@ static irqreturn_t nau8821_interrupt(int irq, void = *data) NAU8821_MICDET_MASK, NAU8821_MICDET_DIS); nau8821_eject_jack(nau8821); event_mask |=3D SND_JACK_HEADSET; - clear_irq =3D NAU8821_JACK_EJECT_IRQ_MASK; } else if (active_irq & NAU8821_KEY_SHORT_PRESS_IRQ) { event |=3D NAU8821_BUTTON; event_mask |=3D NAU8821_BUTTON; - clear_irq =3D NAU8821_KEY_SHORT_PRESS_IRQ; + nau8821_irq_status_clear(regmap, NAU8821_KEY_SHORT_PRESS_IRQ); } else if (active_irq & NAU8821_KEY_RELEASE_IRQ) { event_mask =3D NAU8821_BUTTON; - clear_irq =3D NAU8821_KEY_RELEASE_IRQ; + nau8821_irq_status_clear(regmap, NAU8821_KEY_RELEASE_IRQ); } else if ((active_irq & NAU8821_JACK_INSERT_IRQ_MASK) =3D=3D NAU8821_JACK_INSERT_DETECTED) { cancel_work_sync(&nau8821->jdet_work); @@ -1212,27 +1224,17 @@ static irqreturn_t nau8821_interrupt(int irq, void = *data) /* detect microphone and jack type */ schedule_work(&nau8821->jdet_work); /* Turn off insertion interruption at manual mode */ - regmap_update_bits(regmap, - NAU8821_R12_INTERRUPT_DIS_CTRL, - NAU8821_IRQ_INSERT_DIS, - NAU8821_IRQ_INSERT_DIS); - regmap_update_bits(regmap, - NAU8821_R0F_INTERRUPT_MASK, - NAU8821_IRQ_INSERT_EN, - NAU8821_IRQ_INSERT_EN); nau8821_setup_inserted_irq(nau8821); } else { dev_warn(nau8821->dev, "Inserted IRQ fired but not connected\n"); nau8821_eject_jack(nau8821); } + } else { + /* Clear the rightmost interrupt */ + nau8821_irq_status_clear(regmap, active_irq); } =20 - if (!clear_irq) - clear_irq =3D active_irq; - /* clears the rightmost interruption */ - regmap_write(regmap, NAU8821_R11_INT_CLR_KEY_STATUS, clear_irq); - if (event_mask) snd_soc_jack_report(nau8821->jack, event, event_mask); =20 --=20 2.51.0 From nobody Wed Dec 17 17:47:27 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 70DB82D47FE; Fri, 3 Oct 2025 18:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514615; cv=none; b=i947oiZBj23GrUbDv/8drgp8+YY2F0l8vk4TQZ8kUrC2rPc/RvkHeqUN8qwQNxcumU3sbHfLsz9LsOD02myMxDqKsmNzME1oMzgIzsuxqzp4JFKv+P0g/Fk7p5rq1bSoSQgZ2V21sp9nBYr0bEI88LO7nzZNgrsJo91x7lxhFwA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514615; c=relaxed/simple; bh=Vgbgk+y+NPB1wmd8wO1pCyaZssvyi61KBIIiInoyMKQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C6qbb2Vn68Ra8kCnCe/fCBYfiOxROqQKLt5wvID9u0MDFx22DopOQshUVd06vWc+zk0scCJPUUGkEBkh3KD6t/FnZJDJFMUm4jIZc31veAhPOHLtwk7BoLPqsdoreSN+v5HBXHnbSkdy0WMKE0T7XigcxWW+la9NJ5jpkjc2Guc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=pvS4V9Pd; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="pvS4V9Pd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759514610; bh=Vgbgk+y+NPB1wmd8wO1pCyaZssvyi61KBIIiInoyMKQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pvS4V9PdYqUuACK8Q9VoF7zBKyW/1ZIG+GgerwIs9LlUAVUEHMHmDlhBh7HjQJwRM FQF45+f2InCX7tuqnr77JbSNtpzUoVnGyodQ+ExAGvZ/n98sF9SnbMw1EoKuEbbVZw sqH6QMMQ+ZgSjluq0IjoNcf93ukV2PR2/yIP1uOEk2kmQMXrjiaWeoblVJt9Y3Fdh3 WPofQvdtPjZ7Bw07OpFeJNYMiOsCnSZ+JJ8raI0/jagGnhIMmTj9tUEXA4d2MRH5Cs QShZmvmklRy3VD1qKcYudC/HLv9jweC1VCBt84M3Velmf3yfrFxDnpS9SUzejvC4b/ W5+6U33jflCRg== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with UTF8SMTPSA id BDDB617E13C1; Fri, 3 Oct 2025 20:03:30 +0200 (CEST) From: Cristian Ciocaltea Date: Fri, 03 Oct 2025 21:03:26 +0300 Subject: [PATCH 4/5] ASoC: nau8821: Add DMI quirk to bypass jack debounce circuit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251003-nau8821-jdet-fixes-v1-4-f7b0e2543f09@collabora.com> References: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> In-Reply-To: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Seven Lee Cc: kernel@collabora.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 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 --- sound/soc/codecs/nau8821.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/sound/soc/codecs/nau8821.c b/sound/soc/codecs/nau8821.c index 56e5a0d80782b85d8c256745911297f8edf5dd98..a8ff2ce70be9a94e7094696e06b= da93f27fdea93 100644 --- a/sound/soc/codecs/nau8821.c +++ b/sound/soc/codecs/nau8821.c @@ -26,7 +26,8 @@ #include #include "nau8821.h" =20 -#define NAU8821_JD_ACTIVE_HIGH BIT(0) +#define NAU8821_QUIRK_JD_ACTIVE_HIGH BIT(0) +#define NAU8821_QUIRK_JD_DB_BYPASS BIT(1) =20 static int nau8821_quirk; static int quirk_override =3D -1; @@ -1177,9 +1178,10 @@ static void nau8821_setup_inserted_irq(struct nau882= 1 *nau8821) regmap_update_bits(regmap, NAU8821_R1D_I2S_PCM_CTRL2, NAU8821_I2S_MS_MASK, NAU8821_I2S_MS_SLAVE); =20 - /* 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); =20 /* 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_tabl= e[] =3D { DMI_MATCH(DMI_SYS_VENDOR, "Positivo Tecnologia SA"), DMI_MATCH(DMI_BOARD_NAME, "CW14Q01P-V2"), }, - .driver_data =3D (void *)(NAU8821_JD_ACTIVE_HIGH), + .driver_data =3D (void *)(NAU8821_QUIRK_JD_ACTIVE_HIGH), + }, + { + /* Valve Steam Deck LCD */ + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Valve"), + DMI_MATCH(DMI_PRODUCT_NAME, "Jupiter"), + }, + .driver_data =3D (void *)(NAU8821_QUIRK_JD_DB_BYPASS), + }, + { + /* Valve Steam Deck OLED */ + .matches =3D { + DMI_MATCH(DMI_SYS_VENDOR, "Valve"), + DMI_MATCH(DMI_PRODUCT_NAME, "Galileo"), + }, + .driver_data =3D (void *)(NAU8821_QUIRK_JD_DB_BYPASS), }, {} }; @@ -1906,9 +1924,12 @@ static int nau8821_i2c_probe(struct i2c_client *i2c) =20 nau8821_check_quirks(); =20 - if (nau8821_quirk & NAU8821_JD_ACTIVE_HIGH) + if (nau8821_quirk & NAU8821_QUIRK_JD_ACTIVE_HIGH) nau8821->jkdet_polarity =3D 0; =20 + if (nau8821_quirk & NAU8821_QUIRK_JD_DB_BYPASS) + dev_dbg(dev, "Force bypassing jack detection debounce circuit\n"); + nau8821_print_device_properties(nau8821); =20 nau8821_reset_chip(nau8821->regmap); --=20 2.51.0 From nobody Wed Dec 17 17:47:27 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 70E4A2DCF7C; Fri, 3 Oct 2025 18:03:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514615; cv=none; b=p+QqXBN9jQmKQHQUgWGdPVBw7PzrrLNaboB/7FJUQesjMhtjG8KG3zhUVlGRgqcf8CdcIaZSyOFQ10kgbGM3YJieYAYFS/36o/RUhUuUXvV/zMwrilA/R+Idpxjw6Y1r9j5RdnwUGXDQ3WNjhSu8Lb0DcjHFpSWDXhQd9N8wSOw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759514615; c=relaxed/simple; bh=r9BeudjsMH6lI7IndJz+R0dMlSTF75UDl/Hoh5nL3fg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ju3j02lNhOwuBqiIr3WKOVSAIoniwwS3rQURjGTWwaDpx2aB97XIdeATN1neWju4l7V4A75Dmi+4qgKfhzTfvQNr920toICLCe6a9KkPCCdWE8BwXck2DqA2tW3oPgj/Isk4qwb+LzxDxXY106njLI1jS/gGr4zZ+riOOqKhB+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=joWgKKRr; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="joWgKKRr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759514611; bh=r9BeudjsMH6lI7IndJz+R0dMlSTF75UDl/Hoh5nL3fg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=joWgKKRrPUfr+ZVUb31WMu9Lq9EYmFEKDeUIpTeGxd91B5BY559n7PtiE5lko71/N 2h51SS5Svz9JAz/5YQ1C6XsuN9yp7k2oTlVit+3j7LTtRTywVsu5m2GQyE+O69nCiZ FR0EX6pJ0mRBmqNybMorj7k5shy80mS+YIDL3g6G/48BG5+rQxCK4aA6eqOdWGxTfA w5KsNgkRpLBrjeieQrVvGh4tMhV4Zagb82XuF5gfDv+1/6X2sk1goghM0M6bnkKOq2 kRqJdRvt33QKeH32cvilcnWv/lQWIsPmxgv/q07nBrBWRXm54HjciCAtu7Nfj3hRcv LM2ncX/NG/YaQ== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with UTF8SMTPSA id 92E5C17E13C3; Fri, 3 Oct 2025 20:03:31 +0200 (CEST) From: Cristian Ciocaltea Date: Fri, 03 Oct 2025 21:03:27 +0300 Subject: [PATCH 5/5] ASoC: nau8821: Avoid unnecessary blocking in IRQ handler Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251003-nau8821-jdet-fixes-v1-5-f7b0e2543f09@collabora.com> References: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> In-Reply-To: <20251003-nau8821-jdet-fixes-v1-0-f7b0e2543f09@collabora.com> To: Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Seven Lee Cc: kernel@collabora.com, linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 The interrupt handler offloads the microphone detection logic to nau8821_jdet_work(), which implies a sleep operation. However, before being able to process any subsequent hotplug event, the interrupt handler needs to wait for any prior scheduled work to complete. Move the sleep out of jdet_work by converting it to a delayed work. This eliminates the undesired blocking in the interrupt handler when attempting to cancel a recently scheduled work item and should help reducing transient input reports that might confuse user-space. Signed-off-by: Cristian Ciocaltea --- sound/soc/codecs/nau8821.c | 22 ++++++++++++---------- sound/soc/codecs/nau8821.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/sound/soc/codecs/nau8821.c b/sound/soc/codecs/nau8821.c index a8ff2ce70be9a94e7094696e06bda93f27fdea93..4fa9a785513e52ae509b32a8acd= a7e96dde218d6 100644 --- a/sound/soc/codecs/nau8821.c +++ b/sound/soc/codecs/nau8821.c @@ -1104,16 +1104,12 @@ static void nau8821_eject_jack(struct nau8821 *nau8= 821) static void nau8821_jdet_work(struct work_struct *work) { struct nau8821 *nau8821 =3D - container_of(work, struct nau8821, jdet_work); + container_of(work, struct nau8821, jdet_work.work); struct snd_soc_dapm_context *dapm =3D nau8821->dapm; struct snd_soc_component *component =3D snd_soc_dapm_to_component(dapm); struct regmap *regmap =3D nau8821->regmap; int jack_status_reg, mic_detected, event =3D 0, event_mask =3D 0; =20 - snd_soc_component_force_enable_pin(component, "MICBIAS"); - snd_soc_dapm_sync(dapm); - msleep(20); - regmap_read(regmap, NAU8821_R58_I2C_DEVICE_ID, &jack_status_reg); mic_detected =3D !(jack_status_reg & NAU8821_KEYDET); if (mic_detected) { @@ -1146,6 +1142,7 @@ static void nau8821_jdet_work(struct work_struct *wor= k) snd_soc_component_disable_pin(component, "MICBIAS"); snd_soc_dapm_sync(dapm); } + event_mask |=3D SND_JACK_HEADSET; snd_soc_jack_report(nau8821->jack, event, event_mask); } @@ -1194,6 +1191,7 @@ static irqreturn_t nau8821_interrupt(int irq, void *d= ata) { struct nau8821 *nau8821 =3D (struct nau8821 *)data; struct regmap *regmap =3D nau8821->regmap; + struct snd_soc_component *component; int active_irq, event =3D 0, event_mask =3D 0; =20 if (regmap_read(regmap, NAU8821_R10_IRQ_STATUS, &active_irq)) { @@ -1205,7 +1203,7 @@ static irqreturn_t nau8821_interrupt(int irq, void *d= ata) =20 if ((active_irq & NAU8821_JACK_EJECT_IRQ_MASK) =3D=3D NAU8821_JACK_EJECT_DETECTED) { - cancel_work_sync(&nau8821->jdet_work); + cancel_delayed_work_sync(&nau8821->jdet_work); regmap_update_bits(regmap, NAU8821_R71_ANALOG_ADC_1, NAU8821_MICDET_MASK, NAU8821_MICDET_DIS); nau8821_eject_jack(nau8821); @@ -1219,12 +1217,15 @@ static irqreturn_t nau8821_interrupt(int irq, void = *data) nau8821_irq_status_clear(regmap, NAU8821_KEY_RELEASE_IRQ); } else if ((active_irq & NAU8821_JACK_INSERT_IRQ_MASK) =3D=3D NAU8821_JACK_INSERT_DETECTED) { - cancel_work_sync(&nau8821->jdet_work); + cancel_delayed_work_sync(&nau8821->jdet_work); regmap_update_bits(regmap, NAU8821_R71_ANALOG_ADC_1, NAU8821_MICDET_MASK, NAU8821_MICDET_EN); if (nau8821_is_jack_inserted(regmap)) { - /* detect microphone and jack type */ - schedule_work(&nau8821->jdet_work); + /* Detect microphone and jack type */ + component =3D snd_soc_dapm_to_component(nau8821->dapm); + snd_soc_component_force_enable_pin(component, "MICBIAS"); + snd_soc_dapm_sync(nau8821->dapm); + schedule_delayed_work(&nau8821->jdet_work, msecs_to_jiffies(20)); /* Turn off insertion interruption at manual mode */ nau8821_setup_inserted_irq(nau8821); } else { @@ -1661,7 +1662,8 @@ int nau8821_enable_jack_detect(struct snd_soc_compone= nt *component, =20 nau8821->jack =3D jack; /* Initiate jack detection work queue */ - INIT_WORK(&nau8821->jdet_work, nau8821_jdet_work); + INIT_DELAYED_WORK(&nau8821->jdet_work, nau8821_jdet_work); + ret =3D devm_request_threaded_irq(nau8821->dev, nau8821->irq, NULL, nau8821_interrupt, IRQF_TRIGGER_LOW | IRQF_ONESHOT, "nau8821", nau8821); diff --git a/sound/soc/codecs/nau8821.h b/sound/soc/codecs/nau8821.h index f0935ffafcbecbd1ac52da3c5122a0da28d0ed2a..88602923780d85971135be4ac32= b45e2d2d67517 100644 --- a/sound/soc/codecs/nau8821.h +++ b/sound/soc/codecs/nau8821.h @@ -561,7 +561,7 @@ struct nau8821 { struct regmap *regmap; struct snd_soc_dapm_context *dapm; struct snd_soc_jack *jack; - struct work_struct jdet_work; + struct delayed_work jdet_work; int irq; int clk_id; int micbias_voltage; --=20 2.51.0