Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Mikhail Kshevetskiy" <mikhail.kshevetskiy@iopsys.eu>
Cc: conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org
Subject: Re: [PATCH v10 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers
Date: Wed, 05 Aug 2026 12:58:51 +0000	[thread overview]
Message-ID: <20260805125852.5C6501F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260805123408.3767648-25-mikhail.kshevetskiy@iopsys.eu>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:

New issues:
- [High] Hardcoded SCU compatible string in shared probe function prevents AN7583 and future SoCs from probing.

Pre-existing issues:
- [High] Parent IRQ requested before gpiochip initialization creates a race condition.
- [High] Redundant manual clearing of IRQ status bit leads to permanently lost edge interrupts.
- [High] Lock nesting violation in IRQ callbacks triggers "sleeping in atomic context" on RT kernels.
--

--- Patch [24]: [PATCH v10 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers ---
commit 5233d68e7af6a3826dd884bf3c42e656bc817865
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>

pinctrl: airoha: split driver on shared code and SoC specific drivers

Split the combined an7581/an7583 source file into shared pinctrl code and
SoC-specific pinctrl drivers. The initialization code was also adapted to
work properly for both shared and SoC-specific cases.

> diff --git a/drivers/pinctrl/airoha/pinctrl-airoha.c b/drivers/pinctrl/airoha/pinctrl-airoha.c
> index 55a6efc5887bc..134c57a54b963 100644
> --- a/drivers/pinctrl/airoha/pinctrl-airoha.c
> +++ b/drivers/pinctrl/airoha/pinctrl-airoha.c
[ ... ]
> @@ -3070,6 +781,8 @@ static int airoha_pinctrl_probe(struct platform_device *pdev)
>  	int err, i;
>  
>  	data = device_get_match_data(dev);
> +	if (!data)
> +		return -EINVAL;
>  
>  	pinctrl = devm_kzalloc(dev, sizeof(*pinctrl), GFP_KERNEL);
>  	if (!pinctrl)
> @@ -3086,8 +799,8 @@ static int airoha_pinctrl_probe(struct platform_device *pdev)
>  	pinctrl->chip_scu = map;
>  
>  	/* Init pinctrl desc struct */
> -	pinctrl->desc.name = KBUILD_MODNAME;
> -	pinctrl->desc.owner = THIS_MODULE;
> +	pinctrl->desc.name = data->pinctrl_name;
> +	pinctrl->desc.owner = data->pinctrl_owner;

[Severity: High]
Does this shared probe function prevent other SoCs from probing due to a
hardcoded SCU compatible string?

In airoha_pinctrl_probe(), there appears to be a lookup that ignores the
SoC-specific match data:

	map = syscon_regmap_lookup_by_compatible("airoha,en7581-chip-scu");
	if (IS_ERR(map))
		return PTR_ERR(map);

If the SCU node for the newly added AN7583 uses a different compatible string
(such as "airoha,an7583-chip-scu"), this lookup will fail and return an error.
This would abort the probe and leave pinmux and GPIO functionality unavailable
for the new SoC.

[ ... ]
> @@ -3141,87 +854,10 @@ static int airoha_pinctrl_probe(struct platform_device *pdev)
>  	/* build gpio-chip */
>  	return airoha_pinctrl_add_gpiochip(pinctrl, pdev);
>  }

[Severity: High]
This is a pre-existing issue, but does requesting the parent IRQ before
gpiochip initialization create a race condition?

In airoha_pinctrl_add_gpiochip(), the IRQ is requested early:

	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 the shared IRQ line is asserted immediately by another device and the
Airoha hardware also has a pending interrupt, airoha_irq_handler() could
execute and call generic_handle_domain_irq(girq->domain, offset). Because
devm_gpiochip_add_data() hasn't run yet, girq->domain is still NULL, which
could cause a NULL pointer dereference or a silently dropped interrupt.

[Severity: High]
This is a pre-existing issue, but does the redundant manual clearing of the
IRQ status bit lead to permanently lost edge interrupts?

In airoha_irq_handler(), after servicing an interrupt, the status is cleared:

			generic_handle_domain_irq(girq->domain, offset);
			regmap_write(pinctrl->regmap,
				     pinctrl->gpio_regs->status[i], BIT(irq));

If a new edge interrupt arrives while the child handler is executing, the
hardware latches the new status. This manual write might blindly wipe the
newly latched status before it can be processed, meaning edge-triggered
interrupts could be silently cleared and lost forever under high interrupt
load.

[Severity: High]
This is a pre-existing issue, but could these regmap accesses violate lock
nesting rules in IRQ callbacks and trigger sleeping in atomic context panics
on RT kernels?

In airoha_irq_mask() and airoha_irq_unmask():

	regmap_clear_bits(pinctrl->regmap, gpio_regs->level[index], mask);
	regmap_clear_bits(pinctrl->regmap, gpio_regs->edge[index], mask);

and

		regmap_update_bits(pinctrl->regmap, gpio_regs->level[index],
				   mask, val);

The generic IRQ core calls these functions while holding irq_desc->lock,
which is a raw_spinlock_t. Calling regmap_update_bits() and
regmap_clear_bits() on a syscon regmap internally takes a standard spinlock_t
or mutex. Acquiring a standard sleepable lock inside a raw spinlock protected
region is invalid. 

Should .irq_bus_lock and .irq_bus_sync_unlock be used to perform these regmap
operations outside the raw spinlock context?

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

  reply	other threads:[~2026-08-05 12:58 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05 12:33 [PATCH v10 00/36] pinctrl: airoha: split on shared and SoC drivers, add more SoCs Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 01/36] dt-bindings: pinctrl: airoha: en7581: fix misprint in i2s function name Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 02/36] dt-bindings: pinctrl: airoha: an7583: fix device tree binding schema Mikhail Kshevetskiy
2026-08-06  7:07   ` Krzysztof Kozlowski
2026-08-05 12:33 ` [PATCH v10 03/36] pinctrl: airoha: fix mdio bitfield names Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 04/36] pinctrl: airoha: an7581: fix pinconf of i2c_scl/i2c_sda pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 05/36] pinctrl: airoha: an7583: fix I2C0_SDA_PD register bit order Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 06/36] pinctrl: airoha: an7581: fix mux/conf of pcie_reset pins Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 07/36] dt-bindings: pinctrl: airoha: en7581: allow configuration of pcie_reset pins as gpio or pwm Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 08/36] pinctrl: airoha: an7583: fix muxing of non-gpio default pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 09/36] dt-bindings: pinctrl: airoha: an7583: allow configuration of non-gpio default pins as gpio and pwm Mikhail Kshevetskiy
2026-08-06  7:09   ` Krzysztof Kozlowski
2026-08-05 12:33 ` [PATCH v10 10/36] pinctrl: airoha: fix I2C1 pin mux config for AN7581 Mikhail Kshevetskiy
2026-08-05 12:49   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 11/36] pinctrl: airoha: fix I2C pin mux config for AN7583 Mikhail Kshevetskiy
2026-08-05 12:57   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 12/36] pinctrl: airoha: fix AN7583 MDIO pin mux config Mikhail Kshevetskiy
2026-08-05 12:44   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 13/36] pinctrl: airoha: an7583: fix spi group pins Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 14/36] pinctrl: airoha: add missed get_direction() function for gpio_chip Mikhail Kshevetskiy
2026-08-05 12:52   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 15/36] pinctrl: airoha: add set_direction() helper " Mikhail Kshevetskiy
2026-08-05 12:56   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 16/36] pinctrl: airoha: minor improvements Mikhail Kshevetskiy
2026-08-05 12:56   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 17/36] pinctrl: airoha: fix getting gpiochip/pinctrl pointers in the IRQ handling code Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 18/36] pinctrl: airoha: add missed IRQ resource helpers Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 19/36] pinctrl: airoha: fix IRQ mask/unmask code Mikhail Kshevetskiy
2026-08-05 13:01   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 20/36] pinctrl: airoha: fix edge-triggered interrupts handling Mikhail Kshevetskiy
2026-08-05 12:54   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 21/36] pinctrl: airoha: remove not needed irq_type[] array Mikhail Kshevetskiy
2026-08-05 12:57   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 22/36] pinctrl: airoha: statically allocate gpio regs structure Mikhail Kshevetskiy
2026-08-05 12:59   ` sashiko-bot
2026-08-05 12:33 ` [PATCH v10 23/36] pinctrl: airoha: move common definitions to the separate header Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 24/36] pinctrl: airoha: split driver on shared code and SoC specific drivers Mikhail Kshevetskiy
2026-08-05 12:58   ` sashiko-bot [this message]
2026-08-05 12:33 ` [PATCH v10 25/36] pinctrl: airoha: an7581: remove en7581 prefix from variable names Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 26/36] pinctrl: airoha: an7583: remove an7583 prefix from variable names and definitions Mikhail Kshevetskiy
2026-08-05 12:33 ` [PATCH v10 27/36] pinctrl: airoha: an7583: rename registers to match its an7583 names Mikhail Kshevetskiy
2026-08-05 12:34 ` [PATCH v10 28/36] pinctrl: airoha: an7583: add support for npu_uart pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 29/36] pinctrl: airoha: an7583: add support for pon_alt pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 30/36] pinctrl: airoha: an7583: add support for olt pinmux Mikhail Kshevetskiy
2026-08-05 13:04   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 31/36] dt-bindings: pinctrl: airoha: an7583: add missed features Mikhail Kshevetskiy
2026-08-06  7:12   ` Krzysztof Kozlowski
2026-08-05 12:34 ` [PATCH v10 32/36] pinctrl: airoha: add support of en7523 SoC Mikhail Kshevetskiy
2026-08-05 13:08   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 33/36] pinctrl: airoha: try to find chip scu node by phandle first Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 34/36] dt-bindings: pinctrl: airoha: add support of en7523 pin controller Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 35/36] pinctrl: airoha: add support of an7563 SoC Mikhail Kshevetskiy
2026-08-05 13:11   ` sashiko-bot
2026-08-05 12:34 ` [PATCH v10 36/36] dt-bindings: pinctrl: airoha: add support of an7563 pin controller Mikhail Kshevetskiy
2026-08-05 13:06   ` sashiko-bot

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=20260805125852.5C6501F00A3A@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