Re: [PATCH 2/2] gpio: mmio: get the direction from pinctrl when there are no direction registers
From: Mehmet Fide <hidden>
Date: 2026-09-02 06:52:08
Also in:
imx, linux-gpio, lkml
From: Mehmet Fide <redacted>
[Severity: High] Can assigning this callback cause a scheduling-while-atomic bug? Generic MMIO GPIO chips are initialized with gc->can_sleep set to false. When an interrupt is activated, gpiochip_lock_as_irq() executes with the IRQ descriptor's raw spinlock held. Since it sees the chip is non-sleeping, it invokes this new get_direction callback directly in atomic context:
This one is real and the most important of the three: irq_activate() runs inside the desc->lock region of __setup_irq(), reaches gpiochip_lock_as_irq() through gpiochip_irq_domain_activate(), and for a !can_sleep chip that calls get_direction(), so the pinctrl mutex would be taken with interrupts off. My test kernel had DEBUG_ATOMIC_SLEEP off, the uncontended mutex fastpath hid it. So the callback cannot ask pinctrl. v2 changes the approach: the chip keeps the direction in its existing shadow (sdir, under the chip's raw spinlock), the direction setters update it, and get_direction() only reads the shadow. The pad is asked once, in process context, from the request() callback: gpiolib calls request() right before it calls get_direction() for a newly requested line, so the shadow is seeded from PIN_CONFIG_OUTPUT_ENABLE there and the line reports what the pad says.
[Severity: High] Does returning these pinctrl errors break interrupt setup for valid GPIOs?
With the shadow, get_direction() never fails: a line pinctrl cannot answer for keeps the input default, which is exactly what gpiolib assumed before this patch, so gpiochip_lock_as_irq() behaves as it did.
[Severity: Medium] Will this early exit prevent the patch from determining the initial line state?
Yes, the initial scan in gpiochip_add_data_with_key() runs before the pin ranges exist, so nothing can be read from pinctrl at that point. The v2 commit message will drop that claim; what the series fixes is the WARN and the direction reported for requested lines. Thanks, Mehmet