Netdev List
 help / color / mirror / Atom feed
* [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
@ 2026-03-11  9:26 Carl Lee via B4 Relay
  2026-03-11 11:08 ` Luca Stefani
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Carl Lee via B4 Relay @ 2026-03-11  9:26 UTC (permalink / raw)
  To: netdev, linux-kernel, krzk, carl.lee, peter.shen, colin.huang2

From: Carl Lee <carl.lee@amd.com>

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 <carl.lee@amd.com>
---
 drivers/nfc/nxp-nci/i2c.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
index 6a5ce8ff91f0..6339586a6a1b 100644
--- a/drivers/nfc/nxp-nci/i2c.c
+++ b/drivers/nfc/nxp-nci/i2c.c
@@ -268,6 +268,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 +304,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 <carl.lee@amd.com>



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
  2026-03-11  9:26 [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback Carl Lee via B4 Relay
@ 2026-03-11 11:08 ` Luca Stefani
  2026-05-11 10:11   ` David Heidelberg
  2026-03-11 23:46 ` kernel test robot
  2026-03-12  2:43 ` kernel test robot
  2 siblings, 1 reply; 6+ messages in thread
From: Luca Stefani @ 2026-03-11 11:08 UTC (permalink / raw)
  To: Carl Lee, netdev, linux-kernel, krzk, peter.shen, colin.huang2

[-- Attachment #1: Type: text/plain, Size: 2650 bytes --]


On 11/03/2026 10:26, Carl Lee wrote:
> 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<carl.lee@amd.com>
> ---
>   drivers/nfc/nxp-nci/i2c.c | 11 ++++++++++-
>   1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
> index 6a5ce8ff91f0..6339586a6a1b 100644
> --- a/drivers/nfc/nxp-nci/i2c.c
> +++ b/drivers/nfc/nxp-nci/i2c.c
> @@ -268,6 +268,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 +304,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);
Doesn't build, needs #include <linux/irq.h>
> +	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,

My ACPI NXP1001 table specifies ActiveHigh that properly gets translated 
into IRQF_TRIGGER_HIGH.

Sadly this seems to just show the same storm as before, I played a bit 
with the driver and noticed that it is simply broken on my device, all I 
get are timeouts if I read the NCI device.

I could get it working (reading tags) by hacking the driver a bit, first 
of all I disable the irq as soon as I get it, otherwise I keep getting 
interrupts when the device is in MODE_COLD that would end up setting 
hard_fault to EREMOTEIO. With that in place I re-implemented the 
enable/disable routine in nxp_nci_i2c_set_mode, and that seems to be 
enough to make it working.

[-- Attachment #2: nxp.diff --]
[-- Type: text/x-patch, Size: 2448 bytes --]

diff --git a/drivers/nfc/nxp-nci/core.c b/drivers/nfc/nxp-nci/core.c
index 66b198663387..1bb5995fcdb4 100644
--- a/drivers/nfc/nxp-nci/core.c
+++ b/drivers/nfc/nxp-nci/core.c
@@ -190,10 +190,10 @@ void nxp_nci_remove(struct nci_dev *ndev)
 	if (info->phy_ops->set_mode)
 		info->phy_ops->set_mode(info->phy_id, NXP_NCI_MODE_COLD);
 
+	mutex_unlock(&info->info_lock);
+
 	nci_unregister_device(ndev);
 	nci_free_device(ndev);
-
-	mutex_unlock(&info->info_lock);
 }
 EXPORT_SYMBOL(nxp_nci_remove);
 
diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
index 7aaab92c616c..1e344e7afeab 100644
--- a/drivers/nfc/nxp-nci/i2c.c
+++ b/drivers/nfc/nxp-nci/i2c.c
@@ -43,19 +43,24 @@ struct nxp_nci_i2c_phy {
 			 */
 };
 
-static int nxp_nci_i2c_set_mode(void *phy_id,
-				    enum nxp_nci_mode mode)
+static int nxp_nci_i2c_set_mode(void *phy_id, enum nxp_nci_mode mode)
 {
-	struct nxp_nci_i2c_phy *phy = (struct nxp_nci_i2c_phy *) phy_id;
-
-	gpiod_set_value(phy->gpiod_fw, (mode == NXP_NCI_MODE_FW) ? 1 : 0);
-	gpiod_set_value(phy->gpiod_en, (mode != NXP_NCI_MODE_COLD) ? 1 : 0);
-	usleep_range(10000, 15000);
-
-	if (mode == NXP_NCI_MODE_COLD)
-		phy->hard_fault = 0;
-
-	return 0;
+    struct nxp_nci_i2c_phy *phy = (struct nxp_nci_i2c_phy *) phy_id;
+
+    if (mode == NXP_NCI_MODE_COLD) {
+        disable_irq(phy->i2c_dev->irq);
+        gpiod_set_value(phy->gpiod_fw, 0);
+        gpiod_set_value(phy->gpiod_en, 0);
+        phy->hard_fault = 0;
+        usleep_range(10000, 15000);
+    } else {
+        gpiod_set_value(phy->gpiod_fw, (mode == NXP_NCI_MODE_FW) ? 1 : 0);
+        gpiod_set_value(phy->gpiod_en, 1);
+        msleep(150);
+        phy->hard_fault = 0;
+        enable_irq(phy->i2c_dev->irq);
+    }
+    return 0;
 }
 
 static int nxp_nci_i2c_write(void *phy_id, struct sk_buff *skb)
@@ -317,8 +322,12 @@ static int nxp_nci_i2c_probe(struct i2c_client *client)
 				 nxp_nci_i2c_irq_thread_fn,
 				 irqflags | IRQF_ONESHOT,
 				 NXP_NCI_I2C_DRIVER_NAME, phy);
-	if (r < 0)
+	if (r < 0) {
 		nfc_err(&client->dev, "Unable to register IRQ handler\n");
+		return r;
+	}
+
+	disable_irq(client->irq);
 
 	return r;
 }
@@ -327,8 +336,8 @@ static void nxp_nci_i2c_remove(struct i2c_client *client)
 {
 	struct nxp_nci_i2c_phy *phy = i2c_get_clientdata(client);
 
-	nxp_nci_remove(phy->ndev);
 	free_irq(client->irq, phy);
+	nxp_nci_remove(phy->ndev);
 }
 
 static const struct i2c_device_id nxp_nci_i2c_id_table[] = {

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
  2026-03-11  9:26 [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback Carl Lee via B4 Relay
  2026-03-11 11:08 ` Luca Stefani
@ 2026-03-11 23:46 ` kernel test robot
  2026-03-12  2:43 ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-03-11 23:46 UTC (permalink / raw)
  To: Carl Lee via B4 Relay, netdev, linux-kernel, krzk, carl.lee,
	peter.shen, colin.huang2
  Cc: oe-kbuild-all

Hi Carl,

kernel test robot noticed the following build errors:

[auto build test ERROR on 7109a2155340cc7b21f27e832ece6df03592f2e8]

url:    https://github.com/intel-lab-lkp/linux/commits/Carl-Lee-via-B4-Relay/nfc-nxp-nci-i2c-restore-IRQ-trigger-fallback/20260311-174025
base:   7109a2155340cc7b21f27e832ece6df03592f2e8
patch link:    https://lore.kernel.org/r/20260311-nfc-nxp-nci-i2c-restore-irq-trigger-fallback-v1-1-9e20714411d7%40amd.com
patch subject: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
config: i386-buildonly-randconfig-001-20260312 (https://download.01.org/0day-ci/archive/20260312/202603120758.LA4Bjngo-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.4.0-5) 12.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260312/202603120758.LA4Bjngo-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603120758.LA4Bjngo-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/nfc/nxp-nci/i2c.c: In function 'nxp_nci_i2c_probe':
>> drivers/nfc/nxp-nci/i2c.c:311:20: error: implicit declaration of function 'irq_get_trigger_type' [-Werror=implicit-function-declaration]
     311 |         irqflags = irq_get_trigger_type(client->irq);
         |                    ^~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors


vim +/irq_get_trigger_type +311 drivers/nfc/nxp-nci/i2c.c

   265	
   266	static int nxp_nci_i2c_probe(struct i2c_client *client)
   267	{
   268		struct device *dev = &client->dev;
   269		struct nxp_nci_i2c_phy *phy;
   270		int r;
   271		unsigned long irqflags;
   272	
   273		if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
   274			nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
   275			return -ENODEV;
   276		}
   277	
   278		phy = devm_kzalloc(&client->dev, sizeof(struct nxp_nci_i2c_phy),
   279				   GFP_KERNEL);
   280		if (!phy)
   281			return -ENOMEM;
   282	
   283		phy->i2c_dev = client;
   284		i2c_set_clientdata(client, phy);
   285	
   286		r = devm_acpi_dev_add_driver_gpios(dev, acpi_nxp_nci_gpios);
   287		if (r)
   288			dev_dbg(dev, "Unable to add GPIO mapping table\n");
   289	
   290		phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
   291		if (IS_ERR(phy->gpiod_en)) {
   292			nfc_err(dev, "Failed to get EN gpio\n");
   293			return PTR_ERR(phy->gpiod_en);
   294		}
   295	
   296		phy->gpiod_fw = devm_gpiod_get_optional(dev, "firmware", GPIOD_OUT_LOW);
   297		if (IS_ERR(phy->gpiod_fw)) {
   298			nfc_err(dev, "Failed to get FW gpio\n");
   299			return PTR_ERR(phy->gpiod_fw);
   300		}
   301	
   302		r = nxp_nci_probe(phy, &client->dev, &i2c_phy_ops,
   303				  NXP_NCI_I2C_MAX_PAYLOAD, &phy->ndev);
   304		if (r < 0)
   305			return r;
   306	
   307		/* Prefer the trigger type configured by firmware.
   308		 * Some platforms do not provide it, so fall back to the
   309		 * historically used rising-edge trigger.
   310		 */
 > 311		irqflags = irq_get_trigger_type(client->irq);
   312		if (!irqflags)
   313			irqflags = IRQF_TRIGGER_RISING;
   314	
   315		r = request_threaded_irq(client->irq, NULL,
   316					 nxp_nci_i2c_irq_thread_fn,
   317					 irqflags | IRQF_ONESHOT,
   318					 NXP_NCI_I2C_DRIVER_NAME, phy);
   319		if (r < 0)
   320			nfc_err(&client->dev, "Unable to register IRQ handler\n");
   321	
   322		return r;
   323	}
   324	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
  2026-03-11  9:26 [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback Carl Lee via B4 Relay
  2026-03-11 11:08 ` Luca Stefani
  2026-03-11 23:46 ` kernel test robot
@ 2026-03-12  2:43 ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2026-03-12  2:43 UTC (permalink / raw)
  To: Carl Lee via B4 Relay, netdev, linux-kernel, krzk, carl.lee,
	peter.shen, colin.huang2
  Cc: llvm, oe-kbuild-all

Hi Carl,

kernel test robot noticed the following build errors:

[auto build test ERROR on 7109a2155340cc7b21f27e832ece6df03592f2e8]

url:    https://github.com/intel-lab-lkp/linux/commits/Carl-Lee-via-B4-Relay/nfc-nxp-nci-i2c-restore-IRQ-trigger-fallback/20260311-174025
base:   7109a2155340cc7b21f27e832ece6df03592f2e8
patch link:    https://lore.kernel.org/r/20260311-nfc-nxp-nci-i2c-restore-irq-trigger-fallback-v1-1-9e20714411d7%40amd.com
patch subject: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20260312/202603121049.f2P9Ik4Y-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260312/202603121049.f2P9Ik4Y-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603121049.f2P9Ik4Y-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/nfc/nxp-nci/i2c.c:311:13: error: call to undeclared function 'irq_get_trigger_type'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     311 |         irqflags = irq_get_trigger_type(client->irq);
         |                    ^
   1 error generated.


vim +/irq_get_trigger_type +311 drivers/nfc/nxp-nci/i2c.c

   265	
   266	static int nxp_nci_i2c_probe(struct i2c_client *client)
   267	{
   268		struct device *dev = &client->dev;
   269		struct nxp_nci_i2c_phy *phy;
   270		int r;
   271		unsigned long irqflags;
   272	
   273		if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
   274			nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
   275			return -ENODEV;
   276		}
   277	
   278		phy = devm_kzalloc(&client->dev, sizeof(struct nxp_nci_i2c_phy),
   279				   GFP_KERNEL);
   280		if (!phy)
   281			return -ENOMEM;
   282	
   283		phy->i2c_dev = client;
   284		i2c_set_clientdata(client, phy);
   285	
   286		r = devm_acpi_dev_add_driver_gpios(dev, acpi_nxp_nci_gpios);
   287		if (r)
   288			dev_dbg(dev, "Unable to add GPIO mapping table\n");
   289	
   290		phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
   291		if (IS_ERR(phy->gpiod_en)) {
   292			nfc_err(dev, "Failed to get EN gpio\n");
   293			return PTR_ERR(phy->gpiod_en);
   294		}
   295	
   296		phy->gpiod_fw = devm_gpiod_get_optional(dev, "firmware", GPIOD_OUT_LOW);
   297		if (IS_ERR(phy->gpiod_fw)) {
   298			nfc_err(dev, "Failed to get FW gpio\n");
   299			return PTR_ERR(phy->gpiod_fw);
   300		}
   301	
   302		r = nxp_nci_probe(phy, &client->dev, &i2c_phy_ops,
   303				  NXP_NCI_I2C_MAX_PAYLOAD, &phy->ndev);
   304		if (r < 0)
   305			return r;
   306	
   307		/* Prefer the trigger type configured by firmware.
   308		 * Some platforms do not provide it, so fall back to the
   309		 * historically used rising-edge trigger.
   310		 */
 > 311		irqflags = irq_get_trigger_type(client->irq);
   312		if (!irqflags)
   313			irqflags = IRQF_TRIGGER_RISING;
   314	
   315		r = request_threaded_irq(client->irq, NULL,
   316					 nxp_nci_i2c_irq_thread_fn,
   317					 irqflags | IRQF_ONESHOT,
   318					 NXP_NCI_I2C_DRIVER_NAME, phy);
   319		if (r < 0)
   320			nfc_err(&client->dev, "Unable to register IRQ handler\n");
   321	
   322		return r;
   323	}
   324	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
  2026-03-11 11:08 ` Luca Stefani
@ 2026-05-11 10:11   ` David Heidelberg
  2026-05-11 10:44     ` Luca Stefani
  0 siblings, 1 reply; 6+ messages in thread
From: David Heidelberg @ 2026-05-11 10:11 UTC (permalink / raw)
  To: Luca Stefani, Carl Lee, netdev, krzk, peter.shen, colin.huang2
  Cc: linux-kernel, oe-linux-nfc

On 11/03/2026 12:08, Luca Stefani wrote:
> 
> On 11/03/2026 10:26, Carl Lee wrote:
>> 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<carl.lee@amd.com>
>> ---
>>   drivers/nfc/nxp-nci/i2c.c | 11 ++++++++++-
>>   1 file changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
>> index 6a5ce8ff91f0..6339586a6a1b 100644
>> --- a/drivers/nfc/nxp-nci/i2c.c
>> +++ b/drivers/nfc/nxp-nci/i2c.c
>> @@ -268,6 +268,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 +304,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);
> Doesn't build, needs #include <linux/irq.h>
>> +    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,
> 
> My ACPI NXP1001 table specifies ActiveHigh that properly gets translated into 
> IRQF_TRIGGER_HIGH.

Hello Luca,

I'm looking into the issue, I wonder
would make sense to provide ACPI quirk then?

David
> 
> Sadly this seems to just show the same storm as before, I played a bit with the 
> driver and noticed that it is simply broken on my device, all I get are timeouts 
> if I read the NCI device.
> 
> I could get it working (reading tags) by hacking the driver a bit, first of all 
> I disable the irq as soon as I get it, otherwise I keep getting interrupts when 
> the device is in MODE_COLD that would end up setting hard_fault to EREMOTEIO. 
> With that in place I re-implemented the enable/disable routine in 
> nxp_nci_i2c_set_mode, and that seems to be enough to make it working.

-- 
David Heidelberg


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback
  2026-05-11 10:11   ` David Heidelberg
@ 2026-05-11 10:44     ` Luca Stefani
  0 siblings, 0 replies; 6+ messages in thread
From: Luca Stefani @ 2026-05-11 10:44 UTC (permalink / raw)
  To: David Heidelberg, Carl Lee, netdev, krzk, peter.shen,
	colin.huang2
  Cc: linux-kernel, oe-linux-nfc


On 11/05/2026 12:11, David Heidelberg wrote:
> On 11/03/2026 12:08, Luca Stefani wrote:
>>
>> On 11/03/2026 10:26, Carl Lee wrote:
>>> 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<carl.lee@amd.com>
>>> ---
>>>   drivers/nfc/nxp-nci/i2c.c | 11 ++++++++++-
>>>   1 file changed, 10 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
>>> index 6a5ce8ff91f0..6339586a6a1b 100644
>>> --- a/drivers/nfc/nxp-nci/i2c.c
>>> +++ b/drivers/nfc/nxp-nci/i2c.c
>>> @@ -268,6 +268,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 +304,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);
>> Doesn't build, needs #include <linux/irq.h>
>>> +    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,
>>
>> My ACPI NXP1001 table specifies ActiveHigh that properly gets 
>> translated into IRQF_TRIGGER_HIGH.
>
> Hello Luca,
>
> I'm looking into the issue, I wonder
> would make sense to provide ACPI quirk then?

The old driver didn't really work for me as far as I remember, so if you 
just want to fix the storm, that's fine by me, but it's more a bandaid 
than anything else.

Ideally we'd make the driver work but I didn't get much further compared 
to the diff I sent above.

>
> David
>>
>> Sadly this seems to just show the same storm as before, I played a 
>> bit with the driver and noticed that it is simply broken on my 
>> device, all I get are timeouts if I read the NCI device.
>>
>> I could get it working (reading tags) by hacking the driver a bit, 
>> first of all I disable the irq as soon as I get it, otherwise I keep 
>> getting interrupts when the device is in MODE_COLD that would end up 
>> setting hard_fault to EREMOTEIO. With that in place I re-implemented 
>> the enable/disable routine in nxp_nci_i2c_set_mode, and that seems to 
>> be enough to make it working.
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-05-11 10:44 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-11  9:26 [PATCH] nfc: nxp-nci: i2c: restore IRQ trigger fallback Carl Lee via B4 Relay
2026-03-11 11:08 ` Luca Stefani
2026-05-11 10:11   ` David Heidelberg
2026-05-11 10:44     ` Luca Stefani
2026-03-11 23:46 ` kernel test robot
2026-03-12  2:43 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox