summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorsgalabov <sgalabov@FreeBSD.org>2016-05-06 05:22:25 +0000
committersgalabov <sgalabov@FreeBSD.org>2016-05-06 05:22:25 +0000
commitb834a046349f1e7cf3f151c5cc8a2b60022cbaa1 (patch)
treed9fac5de120cc638249308a42d1d5d5f90c722de /sys/mips
parenteb4486dee856baad533f5cf9ea2e0ea1923187dc (diff)
downloadFreeBSD-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.c23
-rw-r--r--sys/mips/mediatek/mtk_gpio_v2.c31
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;
OpenPOWER on IntegriCloud