summaryrefslogtreecommitdiffstats
path: root/sys/dev/gpio
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/gpio')
-rw-r--r--sys/dev/gpio/gpio_if.m14
-rw-r--r--sys/dev/gpio/gpiobus.c24
-rw-r--r--sys/dev/gpio/gpiobusvar.h2
3 files changed, 40 insertions, 0 deletions
diff --git a/sys/dev/gpio/gpio_if.m b/sys/dev/gpio/gpio_if.m
index adc119e..6306f33 100644
--- a/sys/dev/gpio/gpio_if.m
+++ b/sys/dev/gpio/gpio_if.m
@@ -32,6 +32,13 @@
INTERFACE gpio;
CODE {
+ static device_t
+ gpio_default_get_bus(void)
+ {
+
+ return (NULL);
+ }
+
static int
gpio_default_map_gpios(device_t bus, phandle_t dev,
phandle_t gparent, int gcells, pcell_t *gpios, uint32_t *pin,
@@ -56,6 +63,13 @@ HEADER {
};
#
+# Return the gpiobus device reference
+#
+METHOD device_t get_bus {
+ device_t dev;
+} DEFAULT gpio_default_get_bus;
+
+#
# Get maximum pin number
#
METHOD int pin_max {
diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c
index efff2c0..9579fe2 100644
--- a/sys/dev/gpio/gpiobus.c
+++ b/sys/dev/gpio/gpiobus.c
@@ -131,6 +131,30 @@ gpiobus_print_pins(struct gpiobus_ivar *devi, char *buf, size_t buflen)
strlcat(buf, tmp, buflen);
}
+device_t
+gpiobus_attach_bus(device_t dev)
+{
+ device_t busdev;
+
+ busdev = device_add_child(dev, "gpiobus", -1);
+ if (busdev == NULL)
+ return (NULL);
+ if (device_add_child(dev, "gpioc", -1) == NULL) {
+ device_delete_child(dev, busdev);
+ return (NULL);
+ }
+ bus_generic_attach(dev);
+
+ return (busdev);
+}
+
+int
+gpiobus_detach_bus(device_t dev)
+{
+
+ return (bus_generic_detach(dev));
+}
+
int
gpiobus_init_softc(device_t dev)
{
diff --git a/sys/dev/gpio/gpiobusvar.h b/sys/dev/gpio/gpiobusvar.h
index a1c2be0..5ea4040 100644
--- a/sys/dev/gpio/gpiobusvar.h
+++ b/sys/dev/gpio/gpiobusvar.h
@@ -95,6 +95,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);
#endif
int gpio_check_flags(uint32_t, uint32_t);
+device_t gpiobus_attach_bus(device_t);
+int gpiobus_detach_bus(device_t);
int gpiobus_init_softc(device_t);
extern driver_t gpiobus_driver;
OpenPOWER on IntegriCloud