summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/gpio/gpiobus.c7
-rw-r--r--sys/dev/gpio/gpiobusvar.h2
-rw-r--r--sys/dev/gpio/ofw_gpiobus.c18
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)
{
OpenPOWER on IntegriCloud