summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/amd/common/block/gpio_banks/gpio.c12
-rw-r--r--src/soc/amd/common/block/include/amdblocks/gpio_banks.h4
2 files changed, 12 insertions, 4 deletions
diff --git a/src/soc/amd/common/block/gpio_banks/gpio.c b/src/soc/amd/common/block/gpio_banks/gpio.c
index d7ac89667b..caf07c0192 100644
--- a/src/soc/amd/common/block/gpio_banks/gpio.c
+++ b/src/soc/amd/common/block/gpio_banks/gpio.c
@@ -111,6 +111,12 @@ static void __gpio_update32(gpio_t gpio_num, uint32_t mask, uint32_t or)
gpio_write32(gpio_num, reg);
}
+/* Set specified bits of a register to match those of ctrl. */
+static void __gpio_setbits32(gpio_t gpio_num, uint32_t mask, uint32_t ctrl)
+{
+ __gpio_update32(gpio_num, ~mask, ctrl & mask);
+}
+
static void __gpio_and32(gpio_t gpio_num, uint32_t mask)
{
__gpio_update32(gpio_num, mask, 0);
@@ -143,17 +149,17 @@ int gpio_get(gpio_t gpio_num)
void gpio_set(gpio_t gpio_num, int value)
{
- __gpio_update32(gpio_num, ~GPIO_OUTPUT_MASK, !!value << GPIO_OUTPUT_SHIFT);
+ __gpio_setbits32(gpio_num, GPIO_OUTPUT_VALUE, value ? GPIO_OUTPUT_VALUE : 0);
}
void gpio_input_pulldown(gpio_t gpio_num)
{
- __gpio_update32(gpio_num, ~GPIO_PULLUP_ENABLE, GPIO_PULLDOWN_ENABLE);
+ __gpio_setbits32(gpio_num, GPIO_PULL_MASK, GPIO_PULLDOWN_ENABLE);
}
void gpio_input_pullup(gpio_t gpio_num)
{
- __gpio_update32(gpio_num, ~GPIO_PULLDOWN_ENABLE, GPIO_PULLUP_ENABLE);
+ __gpio_setbits32(gpio_num, GPIO_PULL_MASK, GPIO_PULLUP_ENABLE);
}
void gpio_input(gpio_t gpio_num)
diff --git a/src/soc/amd/common/block/include/amdblocks/gpio_banks.h b/src/soc/amd/common/block/include/amdblocks/gpio_banks.h
index 70f1db3bf0..546d55aa53 100644
--- a/src/soc/amd/common/block/include/amdblocks/gpio_banks.h
+++ b/src/soc/amd/common/block/include/amdblocks/gpio_banks.h
@@ -65,10 +65,12 @@ struct soc_amd_event {
#define GPIO_8KPULLUP_SELECT (1 << 19)
#define GPIO_PULLUP_ENABLE (1 << 20)
#define GPIO_PULLDOWN_ENABLE (1 << 21)
+#define GPIO_PULL_MASK (7 << 19)
+
#define GPIO_OUTPUT_SHIFT 22
-#define GPIO_OUTPUT_MASK (1 << GPIO_OUTPUT_SHIFT)
#define GPIO_OUTPUT_VALUE (1 << GPIO_OUTPUT_SHIFT)
#define GPIO_OUTPUT_ENABLE (1 << 23)
+#define GPIO_OUTPUT_MASK (3 << GPIO_OUTPUT_SHIFT)
#define GPIO_INT_STATUS (1 << 28)
#define GPIO_WAKE_STATUS (1 << 29)