aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorLuiz Otavio O Souza <loos@FreeBSD.org>2015-09-07 21:59:11 +0000
committerLuiz Otavio O Souza <loos@FreeBSD.org>2015-09-07 21:59:11 +0000
commitc80b6ca937d436f3acc02784343964400fc7deff (patch)
tree6ddf35d2e64a006c692861b0c798cca57afcebdc /sys/dev
parent1c292cd806c6f0e5f7df2038583d3ea0f559f9f0 (diff)
downloadsrc-c80b6ca937d436f3acc02784343964400fc7deff.tar.gz
src-c80b6ca937d436f3acc02784343964400fc7deff.zip
Fix off-by-one bugs.
While here, only set the GPIO pin state for output pins. Pointy hat to: loos Sponsored by: Rubicon Communications (Netgate)
Notes
Notes: svn path=/head/; revision=287542
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/rccgpio/rccgpio.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/rccgpio/rccgpio.c b/sys/dev/rccgpio/rccgpio.c
index dc44ac869d1f..8ce11d357afc 100644
--- a/sys/dev/rccgpio/rccgpio.c
+++ b/sys/dev/rccgpio/rccgpio.c
@@ -126,7 +126,7 @@ rcc_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
return (EINVAL);
*caps = rcc_pins[pin].caps;
@@ -140,7 +140,7 @@ rcc_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
return (EINVAL);
/* Flags cannot be changed. */
@@ -155,7 +155,7 @@ rcc_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
return (EINVAL);
memcpy(name, rcc_pins[pin].name, GPIOMAXNAME);
@@ -169,7 +169,7 @@ rcc_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
return (EINVAL);
/* Flags cannot be changed - risk of short-circuit!!! */
@@ -183,7 +183,10 @@ rcc_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
+ return (EINVAL);
+
+ if ((rcc_pins[pin].caps & GPIO_PIN_OUTPUT) == 0)
return (EINVAL);
RCC_GPIO_LOCK(sc);
@@ -204,7 +207,7 @@ rcc_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
uint32_t value;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
return (EINVAL);
RCC_GPIO_LOCK(sc);
@@ -224,7 +227,10 @@ rcc_gpio_pin_toggle(device_t dev, uint32_t pin)
struct rcc_gpio_softc *sc;
sc = device_get_softc(dev);
- if (pin > sc->sc_gpio_npins)
+ if (pin >= sc->sc_gpio_npins)
+ return (EINVAL);
+
+ if ((rcc_pins[pin].caps & GPIO_PIN_OUTPUT) == 0)
return (EINVAL);
RCC_GPIO_LOCK(sc);