Devicetree
 help / color / mirror / Atom feed
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 22/36] pinctrl: airoha: statically allocate gpio regs structure
Date: Tue, 04 Aug 2026 16:30:49 +0000	[thread overview]
Message-ID: <20260804163049.A04ED1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260804160419.3592327-23-mikhail.kshevetskiy@iopsys.eu>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Applying device tree hogs during `pinctrl_enable()` causes a kernel panic due to a NULL pointer dereference.
- [High] Double-ACK of W1C interrupt status register leads to lost edge interrupts.
- [Low] The statically allocated 'airoha_gpiochip_regs' structure is not marked as const.
--

--- Patch [22]: [PATCH v9 22/36] pinctrl: airoha: statically allocate gpio regs structure ---
commit 59e0c76f94587804fea9f38323fde803107848bb
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>

pinctrl: airoha: statically allocate gpio regs structure
    
just a small refactoring to collect all gpio register information
in the one statically allocated structure.

> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 3dc9b3cb0051f..c4d16c5636ef8 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c

[ ... ]

> @@ -339,6 +350,15 @@ static const u32 irq_edge_regs[] = {
>  	REG_GPIO_INT_EDGE3
>  };
>  
> +static struct airoha_gpiochip_regs airoha_gpiochip_regs = {
> +	.data = gpio_data_regs,
> +	.dir = gpio_dir_regs,
> +	.out = gpio_out_regs,
> +	.status = irq_status_regs,
> +	.level = irq_level_regs,
> +	.edge = irq_edge_regs,
> +};
> +

[Severity: Low]
Should this statically allocated structure be marked as const?

Failing to mark both the static structure and the corresponding gpio_regs
pointer in struct airoha_pinctrl as const prevents the compiler from
placing this read-only data in the .rodata section.

[ ... ]

> @@ -411,7 +418,8 @@ struct airoha_pinctrl {
>  	struct regmap *chip_scu;
>  	struct regmap *regmap;
>  
> -	struct airoha_pinctrl_gpiochip gpiochip;
> +	struct gpio_chip gpiochip;
> +	struct airoha_gpiochip_regs *gpio_regs;
>  };

[Severity: Low]
Should this gpio_regs pointer field also be marked as pointing to a const
structure for the same reason?

[ ... ]

> @@ -2683,12 +2693,12 @@ static irqreturn_t airoha_irq_handler(int irq, void *data)
>  	int i;
>  
>  	for (i = 0; i < ARRAY_SIZE(irq_status_regs); i++) {
> -		struct gpio_irq_chip *girq = &pinctrl->gpiochip.chip.irq;
> +		struct gpio_irq_chip *girq = &pinctrl->gpiochip.irq;
>  		u32 regmap;
>  		unsigned long status;
>  		int irq;
>  
> -		if (regmap_read(pinctrl->regmap, pinctrl->gpiochip.status[i],
> +		if (regmap_read(pinctrl->regmap, pinctrl->gpio_regs->status[i],
>  				&regmap))
>  			continue;
>  
> @@ -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));
>  		}
>  		handled |= !!status;
>  	}

[Severity: High]
Can this explicit W1C write clear newly latched interrupts that arrive
during generic_handle_domain_irq() and lose them?

An earlier patch in this series added airoha_irq_ack as the .irq_ack
callback for airoha_gpio_irq_chip, which handles acking by writing to the
W1C (write-one-to-clear) interrupt status register.

For edge-triggered interrupts, the IRQ core calls irq_ack before invoking
the device's interrupt handler. If a new edge interrupt arrives while the
handler is running, the hardware will latch the status bit again.

Will leaving this redundant manual W1C register write unconditionally clear
this newly set status bit without handling the interrupt?

[ ... ]

> @@ -2820,7 +2829,7 @@ static int airoha_pinmux_set_direction(struct pinctrl_dev *pctrl_dev,
>  	if (pin < 0)
>  		return pin;
>  
> -	return airoha_gpio_set_direction(&pinctrl->gpiochip.chip, pin, input);
> +	return airoha_gpio_set_direction(&pinctrl->gpiochip, pin, input);
>  }

[Severity: Critical]
Does this sequence cause a kernel panic due to a NULL pointer dereference
during probe?

If the device tree contains pinctrl-0 hogs with input-enable or output-enable,
it triggers airoha_pinconf_set() when pinctrl_enable() is called in
airoha_pinctrl_probe().

airoha_pinconf_set() calls airoha_pinmux_set_direction(), which uses this
airoha_gpio_set_direction() helper.

Because pinctrl_enable() is called before airoha_pinctrl_add_gpiochip(),
chip->gpiodev is still NULL. When airoha_gpio_set_direction() calls:

    struct airoha_pinctrl *pinctrl = gpiochip_get_data(chip);

Will this return NULL and lead to an immediate dereference when accessing
pinctrl->regmap?

This regression appears to have been introduced earlier in the series when
the set_direction helper replaced safe direct driver data retrieval.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260804160419.3592327-1-mikhail.kshevetskiy@iopsys.eu?part=22

  reply	other threads:[~2026-08-04 16:30 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
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 [this message]
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=20260804163049.A04ED1F000E9@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox