diff options
author | Shamile Khan <shamile.khan@intel.com> | 2015-10-06 10:02:42 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2015-10-07 22:19:34 -0700 |
commit | 7e07e469f35f80337d9bb5c8767a9a35aa348b55 (patch) | |
tree | 6b37b78dc125ee95345d44c9cf16af5942c69b65 /chip/mec1322/gpio.c | |
parent | e05fcfcfe7aa4bcc5d0e4288e5b67e32f83fc2af (diff) | |
download | chrome-ec-7e07e469f35f80337d9bb5c8767a9a35aa348b55.tar.gz |
mec1322: Do not set mux mode to GPIO in gpio_set_flags_by_mask()
gpio_set_flags_by_mask() should only set the GPIO flags for a pin.
gpio_set_alternate_function() should set all mux modes including
GPIO mode for a pin.
This bug was uncovered when a glitch was observed on EC's
LRESET# pin which reset the LPC bus. The glitch was caused when
the LPC interface was re-initialized during execution of EC RW
image. While programming the EC pins for LPC interface, LRESET#
pin was temporarily converted from LRESET# mode to GPIO mode by
gpio_set_flags_by_mask() before it got set back to LRESET# mode
by gpio_set_alternate_function()
BUG=chrome-os-partner:44993
BRANCH=none
TEST=Manually tested on Kunimitsu FAB3. Flashed a coreboot image
in which LPC SERIRQ is set to quiet mode and Clock Run
is enabled and than confirmed that keyboard is functional.
Change-Id: I25865d38bd6b6b5785e4247831722c5a02032138
Signed-off-by: Shamile Khan <shamile.khan@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/304146
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'chip/mec1322/gpio.c')
-rw-r--r-- | chip/mec1322/gpio.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/chip/mec1322/gpio.c b/chip/mec1322/gpio.c index 2159f2f407..fe1bf89fd6 100644 --- a/chip/mec1322/gpio.c +++ b/chip/mec1322/gpio.c @@ -128,9 +128,6 @@ void gpio_set_flags_by_mask(uint32_t port, uint32_t mask, uint32_t flags) else if (!(flags & GPIO_INT_F_LOW)) /* No interrupt flag set */ val |= 0x4 << 4; - /* Use as GPIO */ - val &= ~((1 << 12) | (1 << 13)); - /* Set up level */ if (flags & GPIO_HIGH) val |= (1 << 16); @@ -198,6 +195,9 @@ void gpio_pre_init(void) flags &= ~(GPIO_LOW | GPIO_HIGH); gpio_set_flags_by_mask(g->port, g->mask, flags); + + /* Use as GPIO, not alternate function */ + gpio_set_alternate_function(g->port, g->mask, -1); } } |