diff options
author | Nicolas Boichat <drinkcat@google.com> | 2017-06-12 08:31:56 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-06-11 23:17:19 -0700 |
commit | 3a8bba3bc3bfa5e52a368c89dd84cc25bea7fb16 (patch) | |
tree | 49569d18741887977fb042d94c375baa291347c5 /common/gpio.c | |
parent | cabd486cb297cf647458186751facae61137bbc1 (diff) | |
download | chrome-ec-3a8bba3bc3bfa5e52a368c89dd84cc25bea7fb16.tar.gz |
gpio: Move gpio_get_ternary to common gpio functions
Also, convert from usleep to udelay, as the calling site may not
necessarily be in task context.
BRANCH=none
BUG=b:62242438
TEST=make buildall -j
Change-Id: I9f36f0de4259716a92183b28324c90d974a96239
Reviewed-on: https://chromium-review.googlesource.com/530884
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
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; +} + /*****************************************************************************/ |