summaryrefslogtreecommitdiff
path: root/zephyr/shim/src/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/shim/src/gpio.c')
-rw-r--r--zephyr/shim/src/gpio.c75
1 files changed, 59 insertions, 16 deletions
diff --git a/zephyr/shim/src/gpio.c b/zephyr/shim/src/gpio.c
index 9440b3f3ca..4535674978 100644
--- a/zephyr/shim/src/gpio.c
+++ b/zephyr/shim/src/gpio.c
@@ -69,18 +69,6 @@ struct gpio_signal_callback {
/*
* Validate interrupt flags are valid for the Zephyr GPIO driver.
*/
-#define IS_GPIO_INTERRUPT_FLAG(flag, mask) ((flag & mask) == mask)
-#define VALID_GPIO_INTERRUPT_FLAG(flag) \
- (IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_EDGE_RISING) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_EDGE_FALLING) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_EDGE_BOTH) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_LEVEL_LOW) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_LEVEL_HIGH) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_EDGE_TO_INACTIVE) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_EDGE_TO_ACTIVE) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_LEVEL_INACTIVE) || \
- IS_GPIO_INTERRUPT_FLAG(flag, GPIO_INT_LEVEL_ACTIVE))
-
#define GPIO_INT(sig, f, cb) \
BUILD_ASSERT(VALID_GPIO_INTERRUPT_FLAG(f), \
STRINGIFY(sig) " is not using Zephyr interrupt flags");
@@ -247,11 +235,23 @@ void gpio_set_level_verbose(enum console_channel channel,
(GPIO_OPEN_DRAIN | GPIO_PULL_UP | GPIO_PULL_DOWN | GPIO_INPUT | \
GPIO_OUTPUT)
-static int convert_from_zephyr_flags(const gpio_flags_t zephyr)
+#define FLAGS_HANDLED_FROM_ZEPHYR \
+ (GPIO_DISCONNECTED | GPIO_OPEN_DRAIN | GPIO_PULL_UP | GPIO_PULL_DOWN | \
+ GPIO_OUTPUT_INIT_LOW | GPIO_OUTPUT_INIT_HIGH | GPIO_INPUT | \
+ GPIO_OUTPUT | GPIO_INT_ENABLE | GPIO_INT_EDGE | GPIO_INT_HIGH_1 | \
+ GPIO_INT_LOW_0 | GPIO_VOLTAGE_1P8)
+
+#define FLAGS_HANDLED_TO_ZEPHYR \
+ (GPIO_FLAG_NONE | GPIO_OPEN_DRAIN | GPIO_PULL_UP | GPIO_PULL_DOWN | \
+ GPIO_LOW | GPIO_HIGH | GPIO_INPUT | GPIO_OUTPUT | GPIO_INT_F_RISING | \
+ GPIO_INT_F_FALLING | GPIO_INT_F_LOW | GPIO_INT_F_HIGH | \
+ GPIO_SEL_1P8V)
+
+int convert_from_zephyr_flags(const gpio_flags_t zephyr)
{
/* Start out with the bits that are the same. */
int ec_flags = zephyr & GPIO_CONVERSION_SAME_BITS;
- gpio_flags_t unhandled_flags = zephyr & ~GPIO_CONVERSION_SAME_BITS;
+ gpio_flags_t unhandled_flags = zephyr & (~FLAGS_HANDLED_FROM_ZEPHYR);
/* TODO(b/173789980): handle conversion of more bits? */
if (unhandled_flags) {
@@ -259,14 +259,38 @@ static int convert_from_zephyr_flags(const gpio_flags_t zephyr)
unhandled_flags);
}
+ if (zephyr & GPIO_DISCONNECTED)
+ ec_flags |= GPIO_FLAG_NONE;
+ if (zephyr & GPIO_OUTPUT_INIT_LOW)
+ ec_flags |= GPIO_LOW;
+ if (zephyr & GPIO_OUTPUT_INIT_HIGH)
+ ec_flags |= GPIO_HIGH;
+
+ if (zephyr & GPIO_INT_ENABLE) {
+ if (zephyr & GPIO_INT_EDGE) {
+ if (zephyr & GPIO_INT_HIGH_1)
+ ec_flags |= GPIO_INT_F_RISING;
+ if (zephyr & GPIO_INT_LOW_0)
+ ec_flags |= GPIO_INT_F_FALLING;
+ } else {
+ if (zephyr & GPIO_INT_LOW_0)
+ ec_flags |= GPIO_INT_F_LOW;
+ if (zephyr & GPIO_INT_HIGH_1)
+ ec_flags |= GPIO_INT_F_HIGH;
+ }
+ }
+
+ if (zephyr & GPIO_VOLTAGE_1P8)
+ ec_flags |= GPIO_SEL_1P8V;
+
return ec_flags;
}
-static gpio_flags_t convert_to_zephyr_flags(int ec_flags)
+gpio_flags_t convert_to_zephyr_flags(int ec_flags)
{
/* Start out with the bits that are the same. */
gpio_flags_t zephyr_flags = ec_flags & GPIO_CONVERSION_SAME_BITS;
- int unhandled_flags = ec_flags & ~GPIO_CONVERSION_SAME_BITS;
+ int unhandled_flags = ec_flags & (~FLAGS_HANDLED_TO_ZEPHYR);
/* TODO(b/173789980): handle conversion of more bits? */
if (unhandled_flags) {
@@ -274,6 +298,25 @@ static gpio_flags_t convert_to_zephyr_flags(int ec_flags)
unhandled_flags);
}
+ if (ec_flags & GPIO_FLAG_NONE)
+ zephyr_flags |= GPIO_DISCONNECTED;
+ if (ec_flags & GPIO_LOW)
+ zephyr_flags |= GPIO_OUTPUT_INIT_LOW;
+ if (ec_flags & GPIO_HIGH)
+ zephyr_flags |= GPIO_OUTPUT_INIT_HIGH;
+ if (ec_flags & GPIO_INT_F_RISING)
+ zephyr_flags |= GPIO_INT_ENABLE
+ | GPIO_INT_EDGE | GPIO_INT_HIGH_1;
+ if (ec_flags & GPIO_INT_F_FALLING)
+ zephyr_flags |= GPIO_INT_ENABLE
+ | GPIO_INT_EDGE | GPIO_INT_LOW_0;
+ if (ec_flags & GPIO_INT_F_LOW)
+ zephyr_flags |= GPIO_INT_ENABLE | GPIO_INT_LOW_0;
+ if (ec_flags & GPIO_INT_F_HIGH)
+ zephyr_flags |= GPIO_INT_ENABLE | GPIO_INT_HIGH_1;
+ if (ec_flags & GPIO_SEL_1P8V)
+ zephyr_flags |= GPIO_VOLTAGE_1P8;
+
return zephyr_flags;
}