diff options
author | gonzo <gonzo@FreeBSD.org> | 2013-02-25 08:04:47 +0000 |
---|---|---|
committer | gonzo <gonzo@FreeBSD.org> | 2013-02-25 08:04:47 +0000 |
commit | 3d9e2fd8b2de2a2d70134948d8d53b74322df450 (patch) | |
tree | f833d0d2579511053d668876a05f340c55db8a98 /sys/arm | |
parent | e8ba976b7dfb1172cef92f2d7f0f844edd05ca86 (diff) | |
download | FreeBSD-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
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/ti/ti_gpio.c | 13 |
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)); } |