freebsd-dev/sys/dev/gpio
Andriy Gapon 20077ec02c gpioiic_attach: fix a NULL pointer crash on hints-based systems
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
2020-05-07 13:11:32 +00:00
..
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