diff options
-rw-r--r-- | sys/dev/gpio/gpiobus.c | 7 | ||||
-rw-r--r-- | sys/dev/gpio/gpiobusvar.h | 2 | ||||
-rw-r--r-- | sys/dev/gpio/ofw_gpiobus.c | 18 |
3 files changed, 27 insertions, 0 deletions
diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c index 9579fe2..6e38ca9 100644 --- a/sys/dev/gpio/gpiobus.c +++ b/sys/dev/gpio/gpiobus.c @@ -143,6 +143,9 @@ gpiobus_attach_bus(device_t dev) device_delete_child(dev, busdev); return (NULL); } +#ifdef FDT + ofw_gpiobus_register_provider(dev); +#endif bus_generic_attach(dev); return (busdev); @@ -152,6 +155,10 @@ int gpiobus_detach_bus(device_t dev) { +#ifdef FDT + ofw_gpiobus_unregister_provider(dev); +#endif + return (bus_generic_detach(dev)); } diff --git a/sys/dev/gpio/gpiobusvar.h b/sys/dev/gpio/gpiobusvar.h index 5ea4040..4f84430 100644 --- a/sys/dev/gpio/gpiobusvar.h +++ b/sys/dev/gpio/gpiobusvar.h @@ -93,6 +93,8 @@ gpio_map_gpios(device_t bus, phandle_t dev, phandle_t gparent, int gcells, } device_t ofw_gpiobus_add_fdt_child(device_t, phandle_t); +void ofw_gpiobus_register_provider(device_t); +void ofw_gpiobus_unregister_provider(device_t); #endif int gpio_check_flags(uint32_t, uint32_t); device_t gpiobus_attach_bus(device_t); diff --git a/sys/dev/gpio/ofw_gpiobus.c b/sys/dev/gpio/ofw_gpiobus.c index 225e905..59dcbbd 100644 --- a/sys/dev/gpio/ofw_gpiobus.c +++ b/sys/dev/gpio/ofw_gpiobus.c @@ -217,6 +217,24 @@ ofw_gpiobus_parse_gpios(struct gpiobus_softc *sc, struct gpiobus_ivar *dinfo, return (0); } +void +ofw_gpiobus_register_provider(device_t provider) +{ + phandle_t node; + + node = ofw_bus_get_node(provider); + OF_device_register_xref(OF_xref_from_node(node), provider); +} + +void +ofw_gpiobus_unregister_provider(device_t provider) +{ + phandle_t node; + + node = ofw_bus_get_node(provider); + OF_device_register_xref(OF_xref_from_node(node), NULL); +} + static struct ofw_gpiobus_devinfo * ofw_gpiobus_setup_devinfo(device_t dev, phandle_t node) { |