ARM: when setting a GPIO to put, set the value, then the direction

We saw a problem on x86 last year in which setting direction, then value,
glitched the output and caused problems. Change this code to set the output,
then the direction.

BUG=chrome-os-partner:19420
TEST=Build and boot on pit.
BRANCH=None

Change-Id: Ie40786139b0b496e22a80dc3dd712b6adff03d1e
Signed-off-by: Ronald G. Minnich <rminnich@google.com>
Reviewed-on: https://gerrit.chromium.org/gerrit/59087
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Commit-Queue: Ronald G. Minnich <rminnich@chromium.org>
Tested-by: Ronald G. Minnich <rminnich@chromium.org>
This commit is contained in:
Ronald G. Minnich 2013-06-18 13:02:23 -07:00 committed by ChromeBot
commit 26d60b8958
2 changed files with 4 additions and 4 deletions

View file

@ -170,14 +170,14 @@ int gpio_direction_output(unsigned gpio, int value)
unsigned int val;
struct gpio_bank *bank = gpio_get_bank(gpio);
gpio_cfg_pin(gpio, GPIO_OUTPUT);
val = readl(&bank->dat);
val &= ~DAT_MASK(GPIO_BIT(gpio));
if (value)
val |= DAT_SET(GPIO_BIT(gpio));
writel(val, &bank->dat);
gpio_cfg_pin(gpio, GPIO_OUTPUT);
return 0;
}

View file

@ -170,14 +170,14 @@ int gpio_direction_output(unsigned gpio, int value)
unsigned int val;
struct gpio_bank *bank = gpio_get_bank(gpio);
gpio_cfg_pin(gpio, GPIO_OUTPUT);
val = readl(&bank->dat);
val &= ~DAT_MASK(GPIO_BIT(gpio));
if (value)
val |= DAT_SET(GPIO_BIT(gpio));
writel(val, &bank->dat);
gpio_cfg_pin(gpio, GPIO_OUTPUT);
return 0;
}