From: Carl Lee The driver previously relied on IRQF_TRIGGER_RISING when requesting the interrupt. This was removed to rely on the trigger type provided by firmware. However, some platforms do not propagate the interrupt trigger type to the IRQ descriptor, resulting in interrupts not being triggered. Use the trigger type provided by firmware when available and fall back to the historically used rising-edge trigger otherwise. Signed-off-by: Carl Lee --- Changes in v2: - Add missing 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@amd.com --- drivers/nfc/nxp-nci/i2c.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c index 6a5ce8ff91f0..7aaab92c616c 100644 --- a/drivers/nfc/nxp-nci/i2c.c +++ b/drivers/nfc/nxp-nci/i2c.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,7 @@ static int nxp_nci_i2c_probe(struct i2c_client *client) struct device *dev = &client->dev; struct nxp_nci_i2c_phy *phy; int r; + unsigned long irqflags; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { nfc_err(&client->dev, "Need I2C_FUNC_I2C\n"); @@ -303,9 +305,17 @@ static int nxp_nci_i2c_probe(struct i2c_client *client) if (r < 0) return r; + /* Prefer the trigger type configured by firmware. + * Some platforms do not provide it, so fall back to the + * historically used rising-edge trigger. + */ + 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