summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2016-01-30 16:37:45 -0700
committerTom Warren <twarren@nvidia.com>2016-02-16 09:17:50 -0700
commit651827c0fc3d91e0a6f2170890a11bc77557ee2e (patch)
treeb77e48e7f33309a6eead3ac93c9a99fc5723426b
parent300e2353788d433ec64bd7b529ea9143bb7f4e52 (diff)
downloadu-boot-imx-651827c0fc3d91e0a6f2170890a11bc77557ee2e.zip
u-boot-imx-651827c0fc3d91e0a6f2170890a11bc77557ee2e.tar.gz
u-boot-imx-651827c0fc3d91e0a6f2170890a11bc77557ee2e.tar.bz2
tegra: gpio: Show the GPIO value for outputs
The tegra GPIO controller has two ways of reading the value of a GPIO. It can supply the 'input' value (which is the value read from the pin) and the 'output' value (which is the value being driven from the pin. With a GPIO set to output mode, the 'input' value is always low which is not very useful. This has the unfortunate result that setting a GPIO high still leaves it showing as low in the 'gpio status' command. Adjust the driver to check which direction the GPIO is set to, then read the value from the appropriate register: 'input' for input GPIOs, 'output' for output GPIOs. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Joe Hershberger <joe.hershberger@ni.com> Signed-off-by: Tom Warren <twarren@nvidia.com>
-rw-r--r--drivers/gpio/tegra_gpio.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/gpio/tegra_gpio.c b/drivers/gpio/tegra_gpio.c
index 8e880e2..5a03115 100644
--- a/drivers/gpio/tegra_gpio.c
+++ b/drivers/gpio/tegra_gpio.c
@@ -177,7 +177,10 @@ static int tegra_gpio_get_value(struct udevice *dev, unsigned offset)
debug("%s: pin = %d (port %d:bit %d)\n", __func__,
gpio, GPIO_FULLPORT(gpio), GPIO_BIT(gpio));
- val = readl(&state->bank->gpio_in[GPIO_PORT(gpio)]);
+ if (get_direction(gpio) == DIRECTION_INPUT)
+ val = readl(&state->bank->gpio_in[GPIO_PORT(gpio)]);
+ else
+ val = readl(&state->bank->gpio_out[GPIO_PORT(gpio)]);
return (val >> GPIO_BIT(gpio)) & 1;
}