aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/gpio
diff options
context:
space:
mode:
authorOleksandr Tymoshenko <gonzo@FreeBSD.org>2016-05-12 20:12:45 +0000
committerOleksandr Tymoshenko <gonzo@FreeBSD.org>2016-05-12 20:12:45 +0000
commit3381a3898a104a62aaaefe03cd74a43a84c5b075 (patch)
tree0606b8eed7529ee6272a3350a501c90193df1bb7 /sys/dev/gpio
parent386881472597069c1659c96109bc89e95fc85411 (diff)
downloadsrc-3381a3898a104a62aaaefe03cd74a43a84c5b075.tar.gz
src-3381a3898a104a62aaaefe03cd74a43a84c5b075.zip
Add gpiobus_release_pin function to release mapped pin
Add gpiobus_release_pin as a counterpart for gpiobus_map_pin. Without it it's impossible to properly release pin so if kernel module is reloaded it can't re-use pins again
Notes
Notes: svn path=/head/; revision=299563
Diffstat (limited to 'sys/dev/gpio')
-rw-r--r--sys/dev/gpio/gpiobus.c24
-rw-r--r--sys/dev/gpio/gpiobusvar.h1
2 files changed, 25 insertions, 0 deletions
diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c
index b26a741df31a..21e33b8b36ca 100644
--- a/sys/dev/gpio/gpiobus.c
+++ b/sys/dev/gpio/gpiobus.c
@@ -281,6 +281,30 @@ gpiobus_map_pin(device_t bus, uint32_t pin)
return (0);
}
+/* Release mapped pin */
+int
+gpiobus_release_pin(device_t bus, uint32_t pin)
+{
+ struct gpiobus_softc *sc;
+
+ sc = device_get_softc(bus);
+ /* Consistency check. */
+ if (pin >= sc->sc_npins) {
+ device_printf(bus,
+ "gpiobus_map_pin: invalid pin %d, max=%d\n",
+ pin, sc->sc_npins - 1);
+ return (-1);
+ }
+
+ if (!sc->sc_pins[pin].mapped) {
+ device_printf(bus, "gpiobus_map_pin: pin %d is not mapped\n", pin);
+ return (-1);
+ }
+ sc->sc_pins[pin].mapped = 0;
+
+ return (0);
+}
+
static int
gpiobus_parse_pins(struct gpiobus_softc *sc, device_t child, int mask)
{
diff --git a/sys/dev/gpio/gpiobusvar.h b/sys/dev/gpio/gpiobusvar.h
index 61901a334851..bc4e633a526e 100644
--- a/sys/dev/gpio/gpiobusvar.h
+++ b/sys/dev/gpio/gpiobusvar.h
@@ -138,6 +138,7 @@ int gpiobus_init_softc(device_t);
int gpiobus_alloc_ivars(struct gpiobus_ivar *);
void gpiobus_free_ivars(struct gpiobus_ivar *);
int gpiobus_map_pin(device_t, uint32_t);
+int gpiobus_release_pin(device_t, uint32_t);
extern driver_t gpiobus_driver;