Hi Shiji, thanks for your patch! On Tue, Jun 25, 2024 at 3:22 AM Shiji Yang <yangshiji66@xxxxxxxxxxx> wrote: > bgpio_bits must be aligned with the data bus width. For example, on a > 32 bit big endian system and we only have 16 GPIOs. If we only assume > bgpio_bits=16 we can never control the GPIO because the base address > is the lowest address. > > low address high address > ------------------------------------------------- > | byte3 | byte2 | byte1 | byte0 | > ------------------------------------------------- > | NaN | NaN | gpio8-15 | gpio0-7 | > ------------------------------------------------- > > Fixes: 55b2395e4e92 ("gpio: mmio: handle "ngpios" properly in bgpio_init()") > Fixes: https://github.com/openwrt/openwrt/issues/15739 > Reported-by: Mark Mentovai <mark@xxxxxxxxxxxx> > Signed-off-by: Shiji Yang <yangshiji66@xxxxxxxxxxx> > Suggested-By: Mark Mentovai <mark@xxxxxxxxxxxx> > Reviewed-by: Jonas Gorski <jonas.gorski@xxxxxxxxx> > Tested-by: Lóránd Horváth <lorand.horvath82@xxxxxxxxx> Commit 55b2395e4e92 also contains this: @@ -614,10 +616,15 @@ int bgpio_init(struct gpio_chip *gc, struct device *dev, gc->parent = dev; gc->label = dev_name(dev); gc->base = -1; - gc->ngpio = gc->bgpio_bits; gc->request = bgpio_request; After this patch gc->ngpio will be unset for any GPIO chip that provides a ngpios property, so restore the above line too. But maybe a better fix is: + #include <linux/types.h> (...) + else + gc->bgpio_bits = round_up(gc->ngpio, sizeof(phys_addr_t) * 8); ? Yours, Linus Walleij