20077ec02c
The attach method uses GPIO_GET_BUS() to get a "newbus" device that provides a pin. But on hints-based systems a GPIO controller driver might not be fully initialized yet and it does not know gpiobus hanging off it. Thus, GPIO_GET_BUS() cannot be called yet. The reason is that controller drivers typically create a child gpiobus using gpiobus_attach_bus() and that leads to the following call chain: gpiobus_attach_bus() -> gpiobus_attach() -> bus_generic_attach(gpiobus) -> gpioiic_attach(). So, gpioiic_attach() is called before gpiobus_attach_bus() returns. I observed this bug with nctgpio driver on amd64. I think that the problem was introduced in r355276. The fix is to avoid calling GPIO_GET_BUS() from the attach method. Instead, we know that on hints-based systems only the parent gpiobus can provide the pins. Nothing is changed for FDT-based systems. MFC after: 1 week |
||
---|---|---|
.. | ||
dwgpio | ||
bytgpio.c | ||
chvgpio_reg.h | ||
chvgpio.c | ||
gpio_if.m | ||
gpiobacklight.c | ||
gpiobus_if.m | ||
gpiobus.c | ||
gpiobusvar.h | ||
gpioc.c | ||
gpioiic.c | ||
gpiokeys_codes.c | ||
gpiokeys.c | ||
gpiokeys.h | ||
gpioled_fdt.c | ||
gpioled.c | ||
gpiomdio.c | ||
gpiopower.c | ||
gpiopps.c | ||
gpioregulator.c | ||
gpiospi.c | ||
gpioths.c | ||
ofw_gpiobus.c |