summaryrefslogtreecommitdiffstats
path: root/sys/arm/rockchip
diff options
context:
space:
mode:
authorloos <loos@FreeBSD.org>2015-01-31 19:32:14 +0000
committerloos <loos@FreeBSD.org>2015-01-31 19:32:14 +0000
commit5e1a5939929b3ae8ec6f7e44ddd1b51b3c542cc6 (patch)
tree4edc5f6a6f697cb6c391fc6f0800ce835ba4024d /sys/arm/rockchip
parent92c5395dfebe86676461d4e940ccf2b4249770e5 (diff)
downloadFreeBSD-src-5e1a5939929b3ae8ec6f7e44ddd1b51b3c542cc6.zip
FreeBSD-src-5e1a5939929b3ae8ec6f7e44ddd1b51b3c542cc6.tar.gz
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.
Diffstat (limited to 'sys/arm/rockchip')
-rw-r--r--sys/arm/rockchip/rk30xx_gpio.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/sys/arm/rockchip/rk30xx_gpio.c b/sys/arm/rockchip/rk30xx_gpio.c
index 0728dbf..ce20c1c 100644
--- a/sys/arm/rockchip/rk30xx_gpio.c
+++ b/sys/arm/rockchip/rk30xx_gpio.c
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#include <machine/intr.h>
#include <dev/fdt/fdt_common.h>
+#include <dev/gpio/gpiobusvar.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@@ -73,6 +74,7 @@ __FBSDID("$FreeBSD$");
struct rk30_gpio_softc {
device_t sc_dev;
+ device_t sc_busdev;
struct mtx sc_mtx;
struct resource * sc_mem_res;
struct resource * sc_irq_res;
@@ -210,6 +212,16 @@ rk30_gpio_pin_configure(struct rk30_gpio_softc *sc, struct gpio_pin *pin,
RK30_GPIO_UNLOCK(sc);
}
+static device_t
+rk30_gpio_get_bus(device_t dev)
+{
+ struct rk30_gpio_softc *sc;
+
+ sc = device_get_softc(dev);
+
+ return (sc->sc_busdev);
+}
+
static int
rk30_gpio_pin_max(device_t dev, int *maxpin)
{
@@ -449,15 +461,13 @@ rk30_gpio_attach(device_t dev)
sc->sc_gpio_pins[i].gp_flags = rk30_gpio_get_function(sc, i);
}
sc->sc_gpio_npins = i;
-
- device_add_child(dev, "gpioc", -1);
- device_add_child(dev, "gpiobus", -1);
-
rk30_gpio_sc = sc;
-
rk30_gpio_init();
-
- return (bus_generic_attach(dev));
+ sc->sc_busdev = gpiobus_attach_bus(dev);
+ if (sc->sc_busdev == NULL)
+ goto fail;
+
+ return (0);
fail:
if (sc->sc_irq_res)
@@ -483,6 +493,7 @@ static device_method_t rk30_gpio_methods[] = {
DEVMETHOD(device_detach, rk30_gpio_detach),
/* GPIO protocol */
+ DEVMETHOD(gpio_get_bus, rk30_gpio_get_bus),
DEVMETHOD(gpio_pin_max, rk30_gpio_pin_max),
DEVMETHOD(gpio_pin_getname, rk30_gpio_pin_getname),
DEVMETHOD(gpio_pin_getflags, rk30_gpio_pin_getflags),
OpenPOWER on IntegriCloud