From: sashiko-bot@kernel.org
To: "Mikhail Kshevetskiy" <mikhail.kshevetskiy@iopsys.eu>
Cc: devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v9 18/36] pinctrl: airoha: add missed IRQ resource helpers
Date: Tue, 04 Aug 2026 16:24:55 +0000 [thread overview]
Message-ID: <20260804162456.EC84B1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260804160419.3592327-19-mikhail.kshevetskiy@iopsys.eu>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
Pre-existing issues:
- [High] The irqchip is marked as `IRQCHIP_IMMUTABLE`, but its `.irq_mask` and `.irq_unmask` callbacks fail to call `gpiochip_disable_irq()` and `gpiochip_enable_irq()` respectively.
- [High] The IRQ handler acknowledges (ACKs) the interrupt by clearing the status register after the generic handler logic has executed, leading to lost edge interrupts.
- [High] The driver requests the parent IRQ before the GPIO chip's IRQ domain is registered, creating a race condition if an interrupt fires immediately.
- [High] The irqchip callbacks `airoha_irq_mask` and `airoha_irq_unmask` call syscon regmap functions which acquire a `spinlock_t`, but they are invoked with the irq descriptor's `raw_spinlock_t` held.
--
--- Patch [18]: [PATCH v9 18/36] pinctrl: airoha: add missed IRQ resource helpers ---
commit 0adbdce0f6e107b50fe1d5a5369eb0d66b97d6e1
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Subject: pinctrl: airoha: add missed IRQ resource helpers
This patch adds GPIOCHIP_IRQ_RESOURCE_HELPERS to the airoha_gpio_irq_chip
structure. This ensures .irq_request_resources is hooked up, allowing gpiolib
to properly set GPIOD_FLAG_USED_AS_IRQ. This prevents userspace or other
drivers from incorrectly reconfiguring active IRQ pins as outputs.
> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 8c0a28eec0a17..261180b656392 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
> @@ -2689,6 +2689,7 @@ static const struct irq_chip airoha_gpio_irq_chip = {
> .irq_mask_ack = airoha_irq_mask,
> .irq_set_type = airoha_irq_type,
> .flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE,
[Severity: High]
This is a pre-existing issue, but since this chip is marked as
IRQCHIP_IMMUTABLE, should the airoha_irq_unmask() and airoha_irq_mask()
callbacks call gpiochip_enable_irq() and gpiochip_disable_irq() respectively?
Without these calls, the gpiolib core tracking of FLAG_IRQ_IS_ENABLED can
become desynchronized from the actual hardware state during dynamic unmasking
or masking of GPIO interrupts:
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_irq_unmask() {
...
case IRQ_TYPE_LEVEL_HIGH:
regmap_update_bits(pinctrl->regmap, gpiochip->level[index],
mask, val);
break;
...
}
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_irq_mask() {
...
regmap_clear_bits(pinctrl->regmap, gpiochip->level[index], mask);
regmap_clear_bits(pinctrl->regmap, gpiochip->edge[index], mask);
}
[Severity: High]
This isn't a bug introduced by this patch, but does the irq_mask and
irq_unmask implementation risk deadlocks on PREEMPT_RT kernels?
The airoha_irq_mask() and airoha_irq_unmask() callbacks invoke syscon regmap
functions (like regmap_update_bits and regmap_clear_bits) which acquire a
spinlock_t (a sleepable rt_mutex on PREEMPT_RT).
Since these irqchip callbacks are invoked with the irq descriptor's
raw_spinlock_t held, this creates a wait-context hierarchy violation
(LD_WAIT_SPIN > LD_WAIT_CONFIG).
> + GPIOCHIP_IRQ_RESOURCE_HELPERS,
> };
>
> static int airoha_pinctrl_add_gpiochip(struct airoha_pinctrl *pinctrl,
[Severity: High]
This is a pre-existing issue, but does using handle_simple_irq instead of
handle_edge_irq lead to lost edge interrupts?
In airoha_irq_handler(), the hardware interrupt is acknowledged by clearing
the status register after the generic handler executes:
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_irq_handler() {
...
for_each_set_bit(irq, &status, AIROHA_PIN_BANK_SIZE) {
...
generic_handle_irq(irq_find_mapping(girq->domain,
offset));
regmap_write(pinctrl->regmap,
pinctrl->gpiochip.status[i], BIT(irq));
}
...
}
If a new edge interrupt triggers on the same GPIO pin while
handle_simple_irq() is executing, the unconditional clear (W1C) afterwards
could wipe the newly latched interrupt.
[Severity: High]
This isn't a bug introduced by this patch, but is there a race condition
during initialization?
The driver requests the parent IRQ via devm_request_irq() before the GPIO
chip and its IRQ domain are fully initialized by devm_gpiochip_add_data():
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_pinctrl_add_gpiochip() {
...
err = devm_request_irq(dev, irq, airoha_irq_handler, IRQF_SHARED,
dev_name(dev), pinctrl);
if (err) {
...
}
return devm_gpiochip_add_data(dev, gc, pinctrl);
}
If an interrupt triggers immediately after devm_request_irq(), the handler
executes with a NULL girq->domain. This causes irq_find_mapping() to fail
and return 0, potentially handling an invalid IRQ 0 and dropping the interrupt.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260804160419.3592327-1-mikhail.kshevetskiy@iopsys.eu?part=18
next prev parent reply other threads:[~2026-08-04 16:24 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 16:03 [PATCH v9 00/36] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 01/36] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 02/36] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 03/36] pinctrl: airoha: fix mdio bitfield names Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 04/36] pinctrl: airoha: an7581: fix pinconf of i2c_scl/i2c_sda pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 05/36] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 06/36] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-08-04 16:27 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 07/36] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 08/36] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 09/36] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 10/36] pinctrl: airoha: fix I2C1 pin mux config for AN7581 Mikhail Kshevetskiy
2026-08-04 16:28 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 11/36] pinctrl: airoha: fix I2C pin mux config for AN7583 Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 12/36] pinctrl: airoha: fix AN7583 MDIO pin mux config Mikhail Kshevetskiy
2026-08-04 16:28 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 13/36] pinctrl: airoha: an7583: fix spi group pins Mikhail Kshevetskiy
2026-08-04 16:03 ` [PATCH v9 14/36] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-08-04 16:26 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 15/36] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-08-04 16:26 ` sashiko-bot
2026-08-04 16:03 ` [PATCH v9 16/36] pinctrl: airoha: minor improvements Mikhail Kshevetskiy
2026-08-04 16:23 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 17/36] pinctrl: airoha: fix getting gpiochip/pinctrl pointers in the IRQ handling code Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 18/36] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-08-04 16:24 ` sashiko-bot [this message]
2026-08-04 16:04 ` [PATCH v9 19/36] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-08-04 16:32 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 20/36] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-08-04 16:23 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 21/36] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 22/36] pinctrl: airoha: statically allocate gpio regs structure Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 23/36] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-08-04 16:38 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 25/36] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 26/36] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 27/36] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 28/36] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 29/36] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-08-04 16:29 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 30/36] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-08-04 16:38 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 31/36] dt-bindings: pinctrl: airoha: an7583: add missed features Mikhail Kshevetskiy
2026-08-04 16:04 ` [PATCH v9 32/36] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-08-04 16:44 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 33/36] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-08-04 16:30 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 34/36] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-08-04 16:34 ` sashiko-bot
2026-08-04 18:19 ` Rob Herring (Arm)
2026-08-04 16:04 ` [PATCH v9 35/36] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-08-04 16:35 ` sashiko-bot
2026-08-04 16:04 ` [PATCH v9 36/36] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-08-04 16:33 ` sashiko-bot
2026-08-04 18:19 ` Rob Herring (Arm)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260804162456.EC84B1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=mikhail.kshevetskiy@iopsys.eu \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.