diff options
author | Dino Li <dino.li@ite.com.tw> | 2015-12-14 17:14:37 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-12-14 20:04:54 -0800 |
commit | 57e703ea24bcbaf6773288335110517e7da90da3 (patch) | |
tree | b36ac989291544b93c952fe62b2393b8ff6bad5a /chip/it83xx/gpio.c | |
parent | 313f2ab8c5cf2c1cf52c7316ed8600894b4fc977 (diff) | |
download | chrome-ec-57e703ea24bcbaf6773288335110517e7da90da3.tar.gz |
it8380dev: Implement GPIO mode for KBS pins and fix gpio_set_level()
1. KSO[0-15] and KSI[0-7] can be used as GPIO input if they are not set for
keyboard scan function.
2. Critical section for gpio_set_level().
Signed-off-by: Dino Li <dino.li@ite.com.tw>
BRANCH=none
BUG=none
TEST=console commands: gpioset, gpioget, and version.
Change-Id: I8edae122525e6dcebaa3489116642d8e48520569
Reviewed-on: https://chromium-review.googlesource.com/318112
Commit-Ready: Dino Li <dino.li@ite.com.tw>
Tested-by: Dino Li <dino.li@ite.com.tw>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'chip/it83xx/gpio.c')
-rw-r--r-- | chip/it83xx/gpio.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/chip/it83xx/gpio.c b/chip/it83xx/gpio.c index ea29ace11c..fa4d0306f4 100644 --- a/chip/it83xx/gpio.c +++ b/chip/it83xx/gpio.c @@ -264,12 +264,28 @@ test_mockable int gpio_get_level(enum gpio_signal signal) void gpio_set_level(enum gpio_signal signal, int value) { + uint32_t int_mask = get_int_mask(); + + /* critical section with interrupts off */ + interrupt_disable(); if (value) IT83XX_GPIO_DATA(gpio_list[signal].port) |= gpio_list[signal].mask; else IT83XX_GPIO_DATA(gpio_list[signal].port) &= ~gpio_list[signal].mask; + /* restore interrupts */ + set_int_mask(int_mask); +} + +void gpio_kbs_pin_gpio_mode(uint32_t port, uint32_t mask, uint32_t flags) +{ + if (port == GPIO_KSO_H) + IT83XX_KBS_KSOHGCTRL |= mask; + else if (port == GPIO_KSO_L) + IT83XX_KBS_KSOLGCTRL |= mask; + else if (port == GPIO_KSI) + IT83XX_KBS_KSIGCTRL |= mask; } void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags) @@ -410,8 +426,12 @@ void gpio_pre_init(void) if (is_warm) flags &= ~(GPIO_LOW | GPIO_HIGH); - /* Set up GPIO based on flags */ - gpio_set_flags_by_mask(g->port, g->mask, flags); + if (g->port > GPIO_KBS_OFF) + /* KSO/KSI pins to GPIO mode (input only). */ + gpio_kbs_pin_gpio_mode(g->port, g->mask, flags); + else + /* Set up GPIO based on flags */ + gpio_set_flags_by_mask(g->port, g->mask, flags); } } |