summaryrefslogtreecommitdiff
path: root/common/mkbp_event.c
diff options
context:
space:
mode:
authorHyungwoo Yang <hyungwoo.yang@intel.corp-partner.google.com>2021-01-19 23:17:30 -0800
committerCommit Bot <commit-bot@chromium.org>2021-01-26 19:48:44 +0000
commit8ba2a0dd442aff3dd8cdd486d5c86b15108c1b90 (patch)
tree4438f9939fe8d369c15e682200b6b240a212fbaf /common/mkbp_event.c
parent1e14f4669113703fb496406e6a58602bc17a4001 (diff)
downloadchrome-ec-8ba2a0dd442aff3dd8cdd486d5c86b15108c1b90.tar.gz
zephyr: add MKBP support
Add MKBP support to zephyr. BUG=b:173507858 BRANCH=none TEST=make buildall -j8 build volteer on zephyr Signed-off-by: Hyungwoo Yang <hyungwoo.yang@intel.corp-partner.google.com> Change-Id: I9b7d979241b0df5dc0fa5d9741f05dc9875189ab Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2639854 Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'common/mkbp_event.c')
-rw-r--r--common/mkbp_event.c44
1 files changed, 36 insertions, 8 deletions
diff --git a/common/mkbp_event.c b/common/mkbp_event.c
index 800a95fc16..ac922613d8 100644
--- a/common/mkbp_event.c
+++ b/common/mkbp_event.c
@@ -48,7 +48,7 @@ enum interrupt_state {
};
struct mkbp_state {
- struct mutex lock;
+ mutex_t lock;
uint32_t events;
enum interrupt_state interrupt;
/*
@@ -76,10 +76,23 @@ static uint32_t mkbp_event_wake_mask = CONFIG_MKBP_EVENT_WAKEUP_MASK;
static uint32_t mkbp_host_event_wake_mask = CONFIG_MKBP_HOST_EVENT_WAKEUP_MASK;
#endif /* CONFIG_MKBP_HOST_EVENT_WAKEUP_MASK */
+#ifdef CONFIG_ZEPHYR
+static int init_mkbp_mutex(const struct device *dev)
+{
+ ARG_UNUSED(dev);
+
+ k_mutex_init(&state.lock);
+
+ return 0;
+}
+SYS_INIT(init_mkbp_mutex, POST_KERNEL, 50);
+#endif /* CONFIG_ZEPHYR */
+
#if defined(CONFIG_MKBP_USE_GPIO) || \
defined(CONFIG_MKBP_USE_GPIO_AND_HOST_EVENT)
static int mkbp_set_host_active_via_gpio(int active, uint32_t *timestamp)
{
+ uint32_t lock_key;
/*
* If we want to take a timestamp, then disable interrupts temporarily
* to ensure that the timestamp is as close as possible to the setting
@@ -87,14 +100,14 @@ static int mkbp_set_host_active_via_gpio(int active, uint32_t *timestamp)
* taking the timestamp and setting the gpio)
*/
if (timestamp) {
- interrupt_disable();
+ lock_key = irq_lock();
*timestamp = __hw_clock_source_read();
}
gpio_set_level(GPIO_EC_INT_L, !active);
if (timestamp)
- interrupt_enable();
+ irq_unlock(lock_key);
#ifdef CONFIG_MKBP_USE_GPIO_AND_HOST_EVENT
/*
@@ -363,6 +376,24 @@ static int take_event_if_set(uint8_t event_type)
return taken;
}
+static const struct mkbp_event_source *find_mkbp_event_source(uint8_t type)
+{
+#ifdef CONFIG_ZEPHYR
+ return zephyr_find_mkbp_event_source(type);
+#else
+ const struct mkbp_event_source *src;
+
+ for (src = __mkbp_evt_srcs; src < __mkbp_evt_srcs_end; ++src)
+ if (src->event_type == type)
+ break;
+
+ if (src == __mkbp_evt_srcs_end)
+ return NULL;
+
+ return src;
+#endif
+}
+
static enum ec_status mkbp_get_next_event(struct host_cmd_handler_args *args)
{
static int last;
@@ -393,11 +424,8 @@ static enum ec_status mkbp_get_next_event(struct host_cmd_handler_args *args)
evt = (i + last) % EC_MKBP_EVENT_COUNT;
last = evt + 1;
- for (src = __mkbp_evt_srcs; src < __mkbp_evt_srcs_end; ++src)
- if (src->event_type == evt)
- break;
-
- if (src == __mkbp_evt_srcs_end)
+ src = find_mkbp_event_source(evt);
+ if (src == NULL)
return EC_RES_ERROR;
resp[0] = evt; /* Event type */