diff options
author | sgalabov <sgalabov@FreeBSD.org> | 2016-05-06 05:22:25 +0000 |
---|---|---|
committer | sgalabov <sgalabov@FreeBSD.org> | 2016-05-06 05:22:25 +0000 |
commit | b834a046349f1e7cf3f151c5cc8a2b60022cbaa1 (patch) | |
tree | d9fac5de120cc638249308a42d1d5d5f90c722de /sys/mips | |
parent | eb4486dee856baad533f5cf9ea2e0ea1923187dc (diff) | |
download | FreeBSD-src-b834a046349f1e7cf3f151c5cc8a2b60022cbaa1.zip FreeBSD-src-b834a046349f1e7cf3f151c5cc8a2b60022cbaa1.tar.gz |
mtk_gpio fixes
Allow output pins to be read and input pins to be set.
Fix bugs where we were trying to access the gpio softc before doing
device_get_softc.
Approved by: adrian (mentor)
Sponsored by: Smartcom - Bulgaria AD
Differential Revision: https://reviews.freebsd.org/D6222
Diffstat (limited to 'sys/mips')
-rw-r--r-- | sys/mips/mediatek/mtk_gpio_v1.c | 23 | ||||
-rw-r--r-- | sys/mips/mediatek/mtk_gpio_v2.c | 31 |
2 files changed, 16 insertions, 38 deletions
diff --git a/sys/mips/mediatek/mtk_gpio_v1.c b/sys/mips/mediatek/mtk_gpio_v1.c index ec56360..7ca3a12 100644 --- a/sys/mips/mediatek/mtk_gpio_v1.c +++ b/sys/mips/mediatek/mtk_gpio_v1.c @@ -290,7 +290,7 @@ mtk_gpio_attach(device_t dev) else sc->num_pins = MTK_GPIO_PINS; - for (i = 0; i < num_pins; i++) { + for (i = 0; i < sc->num_pins; i++) { sc->pins[i].pin_caps |= GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | GPIO_PIN_INVIN | GPIO_PIN_INVOUT; sc->pins[i].intr_polarity = INTR_POLARITY_HIGH; @@ -444,18 +444,12 @@ mtk_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value) return (EINVAL); MTK_GPIO_LOCK(sc); - if(!(sc->pins[pin].pin_flags & GPIO_PIN_OUTPUT)) { - ret = EINVAL; - goto out; - } - if (value) MTK_WRITE_4(sc, GPIO_PIOSET, (1u << pin)); else MTK_WRITE_4(sc, GPIO_PIORESET, (1u << pin)); - -out: MTK_GPIO_UNLOCK(sc); + return (ret); } @@ -473,15 +467,10 @@ mtk_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) return (EINVAL); MTK_GPIO_LOCK(sc); - if(!(sc->pins[pin].pin_flags & GPIO_PIN_INPUT)) { - ret = EINVAL; - goto out; - } data = MTK_READ_4(sc, GPIO_PIODATA); *val = (data & (1u << pin)) ? 1 : 0; - -out: MTK_GPIO_UNLOCK(sc); + return (ret); } @@ -491,12 +480,12 @@ mtk_gpio_pin_toggle(device_t dev, uint32_t pin) struct mtk_gpio_softc *sc; int ret; - if (pin >= sc->num_pins) - return (EINVAL); - sc = device_get_softc(dev); ret = 0; + if (pin >= sc->num_pins) + return (EINVAL); + MTK_GPIO_LOCK(sc); if (!(sc->pins[pin].pin_flags & GPIO_PIN_OUTPUT)) { ret = EINVAL; diff --git a/sys/mips/mediatek/mtk_gpio_v2.c b/sys/mips/mediatek/mtk_gpio_v2.c index 66236cc..75c7263 100644 --- a/sys/mips/mediatek/mtk_gpio_v2.c +++ b/sys/mips/mediatek/mtk_gpio_v2.c @@ -428,23 +428,17 @@ mtk_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value) struct mtk_gpio_softc *sc; int ret; - if (pin >= sc->num_pins) - return (EINVAL); - sc = device_get_softc(dev); ret = 0; + if (pin >= sc->num_pins) + return (EINVAL); + MTK_GPIO_LOCK(sc); - if (!(sc->pins[pin].pin_flags & GPIO_PIN_OUTPUT)) { - ret = EINVAL; - goto out; - } if (value) MTK_WRITE_4(sc, GPIO_PIOSET(sc), (1u << pin)); else MTK_WRITE_4(sc, GPIO_PIORESET(sc), (1u << pin)); - -out: MTK_GPIO_UNLOCK(sc); return (ret); @@ -457,22 +451,17 @@ mtk_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) uint32_t data; int ret; - if (pin >= sc->num_pins) - return (EINVAL); - sc = device_get_softc(dev); ret = 0; + if (pin >= sc->num_pins) + return (EINVAL); + MTK_GPIO_LOCK(sc); - if (!(sc->pins[pin].pin_flags & GPIO_PIN_INPUT)) { - ret = EINVAL; - goto out; - } data = MTK_READ_4(sc, GPIO_PIODATA(sc)); *val = (data & (1u << pin)) ? 1 : 0; - -out: MTK_GPIO_UNLOCK(sc); + return (ret); } @@ -483,12 +472,12 @@ mtk_gpio_pin_toggle(device_t dev, uint32_t pin) uint32_t val; int ret; - if (pin >= sc->num_pins) - return (EINVAL); - sc = device_get_softc(dev); ret = 0; + if (pin >= sc->num_pins) + return (EINVAL); + MTK_GPIO_LOCK(sc); if(!(sc->pins[pin].pin_flags & GPIO_PIN_OUTPUT)) { ret = EINVAL; |