summaryrefslogtreecommitdiff
path: root/common/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/gpio.c')
-rw-r--r--common/gpio.c23
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;
+}
+
/*****************************************************************************/