diff options
Diffstat (limited to 'common/gpio.c')
-rw-r--r-- | common/gpio.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/common/gpio.c b/common/gpio.c index f4e3cfe2b8..b0200facfd 100644 --- a/common/gpio.c +++ b/common/gpio.c @@ -8,6 +8,7 @@ #include "common.h" #include "gpio.h" #include "registers.h" +#include "timer.h" #include "util.h" /* GPIO alternate function structure */ @@ -145,4 +146,26 @@ int gpio_is_implemented(enum gpio_signal signal) return !!gpio_list[signal].mask; } +int gpio_get_ternary(enum gpio_signal signal) +{ + int pd, pu; + int flags = gpio_get_default_flags(signal); + + /* Read GPIO with internal pull-down */ + gpio_set_flags(signal, GPIO_INPUT | GPIO_PULL_DOWN); + pd = gpio_get_level(signal); + udelay(100); + + /* Read GPIO with internal pull-up */ + gpio_set_flags(signal, GPIO_INPUT | GPIO_PULL_UP); + pu = gpio_get_level(signal); + udelay(100); + + /* Reset GPIO flags */ + gpio_set_flags(signal, flags); + + /* Check PU and PD readings to determine tristate */ + return pu && !pd ? 2 : pd; +} + /*****************************************************************************/ |