summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgonzo <gonzo@FreeBSD.org>2013-02-25 08:04:47 +0000
committergonzo <gonzo@FreeBSD.org>2013-02-25 08:04:47 +0000
commit3d9e2fd8b2de2a2d70134948d8d53b74322df450 (patch)
treef833d0d2579511053d668876a05f340c55db8a98
parente8ba976b7dfb1172cef92f2d7f0f844edd05ca86 (diff)
downloadFreeBSD-src-3d9e2fd8b2de2a2d70134948d8d53b74322df450.zip
FreeBSD-src-3d9e2fd8b2de2a2d70134948d8d53b74322df450.tar.gz
- Fix off-by-one error when returning max pin number
- Fix GPIOGET for output pins. Requesting state for output pin is valid operation, get the state from TI_GPIO_DATAOUTX register
-rw-r--r--sys/arm/ti/ti_gpio.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/arm/ti/ti_gpio.c b/sys/arm/ti/ti_gpio.c
index 979326fa..6747647 100644
--- a/sys/arm/ti/ti_gpio.c
+++ b/sys/arm/ti/ti_gpio.c
@@ -281,7 +281,7 @@ ti_gpio_pin_max(device_t dev, int *maxpin)
banks++;
}
- *maxpin = (banks * PINS_PER_BANK);
+ *maxpin = (banks * PINS_PER_BANK) - 1;
TI_GPIO_UNLOCK(sc);
@@ -541,13 +541,11 @@ ti_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
/* Sanity check the pin is not configured as an output */
val = ti_gpio_read_4(sc, bank, TI_GPIO_OE);
- if ((val & mask) == mask) {
- TI_GPIO_UNLOCK(sc);
- return (EINVAL);
- }
-
/* Read the value on the pin */
- *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAIN) & mask) ? 1 : 0;
+ if (val & mask)
+ *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAOUT) & mask) ? 1 : 0;
+ else
+ *value = (ti_gpio_read_4(sc, bank, TI_GPIO_DATAIN) & mask) ? 1 : 0;
TI_GPIO_UNLOCK(sc);
@@ -728,6 +726,7 @@ ti_gpio_attach(device_t dev)
/* Finish of the probe call */
device_add_child(dev, "gpioc", device_get_unit(dev));
device_add_child(dev, "gpiobus", device_get_unit(dev));
+
return (bus_generic_attach(dev));
}
OpenPOWER on IntegriCloud