Re: [PATCH] gpiolib: tolerate gpio-hogs lacking a hogging state
From: Bartosz Golaszewski
Date: Wed Jul 15 2026 - 08:17:29 EST
On Tue, 14 Jul 2026 10:45:48 +0200, Andy Shevchenko
<andriy.shevchenko@xxxxxxxxxxxxxxx> said:
> On Tue, Jul 14, 2026 at 12:30:53AM +0100, Daniel Golle wrote:
>> Commit d1d564ec4992 ("gpio: move hogs into GPIO core") made
>> gpiochip_add_hog() return -EINVAL for hog nodes lacking any of the
>> 'input', 'output-low' or 'output-high' properties. The error is
>> propagated by gpiochip_hog_lines() and fails registration of the
>> whole GPIO chip.
>>
>> The previous OF-specific implementation tolerated such nodes:
>> of_parse_own_gpio() warned "no hogging state specified, bailing out"
>> and of_gpiochip_add_hog() stopped processing the node without failing
>> chip registration.
>>
>> Some boards deliberately ship hog nodes without a hogging state in
>> their base devicetree and supply the state via overlay, e.g. the PCIe
>> slot key selection hogs on the BananaPi R4 Pro added in
>> commit e309fa232d12 ("arm64: dts: mediatek: mt7988a-bpi-r4pro: rework
>> pcie gpio-hog handling"), as the polarity set in the base devicetree
>> could not be overridden from an overlay.
>>
>> Booting such a board without an overlay applied now fails to register
>> the gpiochip. On the BananaPi R4 Pro this means the MT7988A pinctrl
>> device fails to probe, all peripherals including the console UART
>> defer forever, and the board finally hangs when clk_disable_unused()
>> gates the clocks of the UART still in use by earlycon:
>>
>> gpiochip_add_data_with_key: GPIOs 512..595 (pinctrl_moore) failed to register, -22
>> mt7988-pinctrl 1001f000.pinctrl: error -EINVAL: Failed to add gpio_chip
>> ...
>> clk: Disabling unused clocks
>> (hangs)
>>
>> Restore the previous behaviour by warning about hog nodes lacking a
>> hogging state and skipping them instead of failing the registration
>> of the whole GPIO chip.
>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
>
> ...
>
>> - if (fwnode_property_present(fwnode, "input"))
>> + if (fwnode_property_present(fwnode, "input")) {
>> dflags |= GPIOD_IN;
>> - else if (fwnode_property_present(fwnode, "output-low"))
>> + } else if (fwnode_property_present(fwnode, "output-low")) {
>> dflags |= GPIOD_OUT_LOW;
>> - else if (fwnode_property_present(fwnode, "output-high"))
>> + } else if (fwnode_property_present(fwnode, "output-high")) {
>> dflags |= GPIOD_OUT_HIGH;
>
> For a fix I would make it less invasive and yes, break the style, by just
> replacing
>
Nah, this is fine as is, let me queue this and sorry for the trouble, thanks
for spotting and fixing it!
Bart