From: sashiko-bot@kernel.org
To: "Mikhail Kshevetskiy" <mikhail.kshevetskiy@iopsys.eu>
Cc: conor+dt@kernel.org, robh@kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v11 23/37] pinctrl: airoha: statically allocate gpio regs structure
Date: Thu, 06 Aug 2026 22:31:00 +0000 [thread overview]
Message-ID: <20260806223101.5EA771F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260806220615.4078303-24-mikhail.kshevetskiy@iopsys.eu>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
New issues:
- [Critical] Refactoring pinctrl callbacks to use gpio_chip callbacks introduces a NULL pointer dereference during probe if device tree hogs are present.
- [Medium] Removing calls to `pinctrl_gpio_direction_input` and `pinctrl_gpio_direction_output` breaks pinctrl core synchronization.
Pre-existing issues:
- [High] The IRQ handler performs an unconditional W1C (write-1-to-clear) on the status register after calling `generic_handle_domain_irq()`, which causes lost edge interrupts.
--
--- Patch [23]: [PATCH v11 23/37] pinctrl: airoha: statically allocate gpio regs structure ---
commit c84002cfd05f8b4af2f361901c228a9a5666724b
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
pinctrl: airoha: statically allocate gpio regs structure
This commit refactors the airoha pinctrl driver to collect all GPIO register
information into a single statically allocated structure.
> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 8e418f27fd8bc..e8d5252b17f30 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
[ ... ]
> @@ -2547,7 +2556,8 @@ static int airoha_gpio_set_direction(struct gpio_chip *chip, unsigned int gpio,
> /* set output enable */
> mask = BIT(gpio % AIROHA_PIN_BANK_SIZE);
> index = gpio / AIROHA_PIN_BANK_SIZE;
[Severity: Critical]
Does this code introduce a NULL pointer dereference during probe if device
tree hogs are present?
If pinctrl_enable() is called in airoha_pinctrl_probe() before
airoha_pinctrl_add_gpiochip() initializes the gpio_chip, applying DT hogs
will trigger pinctrl callbacks like airoha_pinmux_set_direction().
These callbacks delegate to airoha_gpio_set_direction(), which retrieves
the pinctrl context using gpiochip_get_data(chip):
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_gpio_set_direction() {
struct airoha_pinctrl *pinctrl = gpiochip_get_data(chip);
...
}
Since chip->gpiodev is not allocated until gpiochip_add_data() is called,
dereferencing chip->gpiodev->data during gpiochip_get_data() results in a
kernel panic.
> - err = regmap_update_bits(pinctrl->regmap, pinctrl->gpiochip.out[index],
> + err = regmap_update_bits(pinctrl->regmap,
> + pinctrl->gpio_regs->out[index],
> mask, !input ? mask : 0);
> if (err)
> return err;
> @@ -2557,7 +2567,7 @@ static int airoha_gpio_set_direction(struct gpio_chip *chip, unsigned int gpio,
> index = gpio / AIROHA_REG_GPIOCTRL_NUM_PIN;
>
> return regmap_update_bits(pinctrl->regmap,
> - pinctrl->gpiochip.dir[index], mask,
> + pinctrl->gpio_regs->dir[index], mask,
> !input ? mask : 0);
> }
[Severity: Medium]
Does the omission of pinctrl_gpio_direction_input() and
pinctrl_gpio_direction_output() break pinctrl core synchronization?
When a consumer driver requests a pin direction change via gpiolib (e.g.,
gpiod_direction_input()), the driver's airoha_gpio_direction_input() callback
bypasses pinctrl_gpio_direction_input() and directly configures the hardware
register:
drivers/pinctrl/airoha/pinctrl-airoha.c:airoha_gpio_direction_input() {
return airoha_gpio_set_direction(chip, gpio, true);
}
This leaves the pinctrl core unaware of the change, leading to stale states
in debugfs and bypassed pinctrl locking and semantics.
[ ... ]
> @@ -2698,7 +2708,7 @@ static irqreturn_t airoha_irq_handler(int irq, void *data)
>
> generic_handle_domain_irq(girq->domain, offset);
> regmap_write(pinctrl->regmap,
> - pinctrl->gpiochip.status[i], BIT(irq));
> + pinctrl->gpio_regs->status[i], BIT(irq));
[Severity: High]
This is a pre-existing issue, but does this unconditional clear operation
cause lost edge-triggered interrupts?
When an edge interrupt triggers, handle_edge_irq() handles it by first
calling irq_ack() (implemented via airoha_irq_ack()) to clear the status
bit. It then runs the child ISR.
If a new edge occurs during the child ISR execution, the hardware correctly
latches the new interrupt in the status register. However, when control
returns to airoha_irq_handler(), it executes this redundant regmap_write()
to clear the status bit again, which destroys the newly latched interrupt
before it can be handled.
> }
> handled |= !!status;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260806220615.4078303-1-mikhail.kshevetskiy@iopsys.eu?part=23
next prev parent reply other threads:[~2026-08-06 22:31 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-06 22:05 [PATCH v11 00/37] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 01/37] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 02/37] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 03/37] pinctrl: airoha: fix mdio bitfield names Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 04/37] pinctrl: airoha: an7581: fix pinconf of i2c_scl/i2c_sda pins Mikhail Kshevetskiy
2026-08-06 22:18 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 05/37] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 06/37] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-08-06 22:31 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 07/37] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 08/37] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-08-06 22:26 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 09/37] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 10/37] pinctrl: airoha: fix I2C1 pin mux config for AN7581 Mikhail Kshevetskiy
2026-08-06 22:20 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 11/37] dt-bindings: pinctrl: airoha: an7583: add i2c0 group for i2c function Mikhail Kshevetskiy
2026-08-06 22:20 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 12/37] pinctrl: airoha: fix I2C pin mux config for AN7583 Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 13/37] pinctrl: airoha: fix AN7583 MDIO pin mux config Mikhail Kshevetskiy
2026-08-06 22:21 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 14/37] pinctrl: airoha: an7583: fix spi group pins Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 15/37] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 16/37] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-08-06 22:28 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 17/37] pinctrl: airoha: minor improvements Mikhail Kshevetskiy
2026-08-06 22:21 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 18/37] pinctrl: airoha: fix getting gpiochip/pinctrl pointers in the IRQ handling code Mikhail Kshevetskiy
2026-08-06 22:05 ` [PATCH v11 19/37] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-08-06 22:21 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 20/37] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-08-06 22:24 ` sashiko-bot
2026-08-06 22:05 ` [PATCH v11 21/37] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-08-06 22:23 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 22/37] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 23/37] pinctrl: airoha: statically allocate gpio regs structure Mikhail Kshevetskiy
2026-08-06 22:31 ` sashiko-bot [this message]
2026-08-06 22:06 ` [PATCH v11 24/37] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 25/37] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-08-06 22:37 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 26/37] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 27/37] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 28/37] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 29/37] dt-bindings: pinctrl: airoha: an7583: add missed features Mikhail Kshevetskiy
2026-08-06 22:26 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 30/37] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 31/37] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 32/37] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-08-06 22:06 ` [PATCH v11 33/37] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-08-06 22:34 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 34/37] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-08-06 22:33 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 35/37] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-08-06 22:29 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 36/37] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-08-06 22:34 ` sashiko-bot
2026-08-06 22:06 ` [PATCH v11 37/37] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-08-07 16:07 ` [PATCH v11 00/37] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Linus Walleij
2026-08-07 16:17 ` Benjamin Larsson
2026-08-07 16:38 ` Mikhail Kshevetskiy
2026-08-07 17:20 ` Linus Walleij
2026-08-07 17:22 ` Mikhail Kshevetskiy
2026-08-07 18:45 ` Linus Walleij
2026-08-07 19:02 ` Mikhail Kshevetskiy
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=20260806223101.5EA771F000E9@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.