diff options
author | Luiz Otavio O Souza <loos@FreeBSD.org> | 2015-01-31 19:32:14 +0000 |
---|---|---|
committer | Luiz Otavio O Souza <loos@FreeBSD.org> | 2015-01-31 19:32:14 +0000 |
commit | 7836352b50ed9a6eb4dd72604e7cb42472a91484 (patch) | |
tree | 4edc5f6a6f697cb6c391fc6f0800ce835ba4024d /sys/mips/cavium | |
parent | 79215b4a3ddebcb7f81400259561970873716898 (diff) | |
download | src-7836352b50ed9a6eb4dd72604e7cb42472a91484.tar.gz src-7836352b50ed9a6eb4dd72604e7cb42472a91484.zip |
Implement GPIO_GET_BUS() method for all GPIO drivers.
Add helper routines to deal with attach and detach of gpiobus and gpioc
devices that are common to all drivers.
Notes
Notes:
svn path=/head/; revision=277996
Diffstat (limited to 'sys/mips/cavium')
-rw-r--r-- | sys/mips/cavium/octeon_gpio.c | 25 | ||||
-rw-r--r-- | sys/mips/cavium/octeon_gpiovar.h | 1 |
2 files changed, 21 insertions, 5 deletions
diff --git a/sys/mips/cavium/octeon_gpio.c b/sys/mips/cavium/octeon_gpio.c index 1053976c508f..58aea5ad936e 100644 --- a/sys/mips/cavium/octeon_gpio.c +++ b/sys/mips/cavium/octeon_gpio.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include <mips/cavium/octeon_irq.h> #include <mips/cavium/octeon_gpiovar.h> +#include <dev/gpio/gpiobusvar.h> #include "gpio_if.h" @@ -90,6 +91,7 @@ static void octeon_gpio_intr(void *arg); /* * GPIO interface */ +static device_t octeon_gpio_get_bus(device_t); static int octeon_gpio_pin_max(device_t dev, int *maxpin); static int octeon_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps); static int octeon_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t @@ -134,6 +136,16 @@ octeon_gpio_pin_configure(struct octeon_gpio_softc *sc, struct gpio_pin *pin, GPIO_UNLOCK(sc); } +static device_t +octeon_gpio_get_bus(device_t dev) +{ + struct octeon_gpio_softc *sc; + + sc = device_get_softc(dev); + + return (sc->busdev); +} + static int octeon_gpio_pin_max(device_t dev, int *maxpin) { @@ -434,11 +446,13 @@ octeon_gpio_attach(device_t dev) gpio_cfgx.s.int_en, gpio_cfgx.s.int_type ? "rising edge" : "level"); } } + sc->busdev = gpiobus_attach_bus(dev); + if (sc->busdev == NULL) { + octeon_gpio_detach(dev); + return (ENXIO); + } - device_add_child(dev, "gpioc", -1); - device_add_child(dev, "gpiobus", -1); - - return (bus_generic_attach(dev)); + return (0); } static int @@ -457,7 +471,7 @@ octeon_gpio_detach(device_t dev) bus_release_resource(dev, SYS_RES_IRQ, sc->gpio_irq_rid[i], sc->gpio_irq_res[i]); } - bus_generic_detach(dev); + gpiobus_detach_bus(dev); mtx_destroy(&sc->gpio_mtx); return(0); @@ -470,6 +484,7 @@ static device_method_t octeon_gpio_methods[] = { DEVMETHOD(device_detach, octeon_gpio_detach), /* GPIO protocol */ + DEVMETHOD(gpio_get_bus, octeon_gpio_get_bus), DEVMETHOD(gpio_pin_max, octeon_gpio_pin_max), DEVMETHOD(gpio_pin_getname, octeon_gpio_pin_getname), DEVMETHOD(gpio_pin_getflags, octeon_gpio_pin_getflags), diff --git a/sys/mips/cavium/octeon_gpiovar.h b/sys/mips/cavium/octeon_gpiovar.h index a9b814fefb8d..4cf007d3be64 100644 --- a/sys/mips/cavium/octeon_gpiovar.h +++ b/sys/mips/cavium/octeon_gpiovar.h @@ -43,6 +43,7 @@ struct octeon_gpio_softc { device_t dev; + device_t busdev; struct mtx gpio_mtx; struct resource *gpio_irq_res[OCTEON_GPIO_IRQS]; int gpio_irq_rid[OCTEON_GPIO_IRQS]; |