Re: [PATCH v3] nfc: nxp-nci: i2c: use rising-edge IRQ on ACPI systems
From: Mark Pearson
Date: Sun May 17 2026 - 09:42:46 EST
Thanks Carl
On Sat, May 16, 2026, at 7:55 AM, Carl Lee via B4 Relay wrote:
> From: Carl Lee <carl.lee@xxxxxxx>
>
> Some ACPI-based platforms report incorrect IRQ trigger types (e.g.
> IRQF_TRIGGER_HIGH), which can lead to interrupt storms.
>
> Use the historically working rising-edge trigger on ACPI systems to
> avoid this regression.
>
> Device Tree-based systems continue to use the firmware-provided
> trigger type.
>
> Signed-off-by: Carl Lee <carl.lee@xxxxxxx>
> ---
> Some ACPI-based platforms report incorrect IRQ trigger types,
> which can lead to interrupt storms.
>
> Use rising-edge IRQ on ACPI systems to avoid this regression,
> while keeping firmware-provided trigger types on non-ACPI systems.
>
> Cc: netdev@xxxxxxxxxxxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx
> Cc: krzk@xxxxxxxxxx
> Cc: carl.lee@xxxxxxx
> Cc: peter.shen@xxxxxxx
> Cc: colin.huang2@xxxxxxx
> Cc: kuba@xxxxxxxxxx
> Cc: david@xxxxxxx
> Cc: luca.stefani.ge1@xxxxxxxxx
> Cc: brgl@xxxxxxxxxx
> Cc: mpearson@xxxxxxxxx
> ---
> Changes in v3:
> - Use rising-edge IRQ on ACPI systems to avoid interrupt storms
> - Keep using firmware-provided trigger type on non-ACPI systems
> - Refine commit message to focus on regression on ACPI platforms
> - Link to v2:
> https://lore.kernel.org/r/20260312-nfc-nxp-nci-i2c-restore-irq-trigger-fallback-v2-1-362348f7fa30@xxxxxxx
>
> Changes in v2:
> - Add missing <linux/irq.h> include for irq_get_trigger_type().
> - Link to v1:
> https://lore.kernel.org/r/20260311-nfc-nxp-nci-i2c-restore-irq-trigger-fallback-v1-1-9e20714411d7@xxxxxxx
> ---
> drivers/nfc/nxp-nci/i2c.c | 21 ++++++++++++++++++++-
> 1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
> index 6a5ce8ff91f0..266dc231c47d 100644
> --- a/drivers/nfc/nxp-nci/i2c.c
> +++ b/drivers/nfc/nxp-nci/i2c.c
> @@ -16,6 +16,7 @@
> #include <linux/delay.h>
> #include <linux/i2c.h>
> #include <linux/interrupt.h>
> +#include <linux/irq.h>
> #include <linux/module.h>
> #include <linux/nfc.h>
> #include <linux/gpio/consumer.h>
> @@ -267,6 +268,7 @@ static int nxp_nci_i2c_probe(struct i2c_client *client)
> {
> struct device *dev = &client->dev;
> struct nxp_nci_i2c_phy *phy;
> + unsigned long irqflags;
> int r;
>
> if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
> @@ -303,9 +305,26 @@ static int nxp_nci_i2c_probe(struct i2c_client *client)
> if (r < 0)
> return r;
>
> + /*
> + * ACPI platforms may report incorrect IRQ trigger types
> + * (e.g. level-high), which can lead to interrupt storms.
> + *
> + * Use the historically stable rising-edge trigger for ACPI devices.
> + *
> + * On non-ACPI systems (e.g. Device Tree), prefer the firmware-
> + * provided trigger type, falling back to rising-edge if not set.
> + */
> + if (ACPI_COMPANION(dev)) {
> + irqflags = IRQF_TRIGGER_RISING;
> + } else {
> + irqflags = irq_get_trigger_type(client->irq);
> + if (!irqflags)
> + irqflags = IRQF_TRIGGER_RISING;
> + }
> +
> r = request_threaded_irq(client->irq, NULL,
> nxp_nci_i2c_irq_thread_fn,
> - IRQF_ONESHOT,
> + irqflags | IRQF_ONESHOT,
> NXP_NCI_I2C_DRIVER_NAME, phy);
> if (r < 0)
> nfc_err(&client->dev, "Unable to register IRQ handler\n");
>
> ---
> base-commit: 7109a2155340cc7b21f27e832ece6df03592f2e8
> change-id: 20260311-nfc-nxp-nci-i2c-restore-irq-trigger-fallback-cda942530c60
>
> Best regards,
> --
> Carl Lee <carl.lee@xxxxxxx>
Looks like a good solution to me, at least until we can figure out how to make this work correclty on ACPI systems.
Checked it on my T16 G5 AMD, fixes the issue. I'll put it on few more systems, but I'm confident it works.
Reviewed-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx>
Tested-by: Mark Pearson <mpearson-lenovo@xxxxxxxxx>
Mark