diff options
author | Dino Li <dino.li@ite.com.tw> | 2016-01-05 13:49:57 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-01-05 23:39:11 -0800 |
commit | 0c8a1b8d39734eaae692eacbe04894207bb2c6da (patch) | |
tree | 27369562b39a8a4aeb54b1da65ec7abaceb8ca4b | |
parent | c3ce180fb06e4d5097e9fd262ff54fa701df3cd3 (diff) | |
download | chrome-ec-0c8a1b8d39734eaae692eacbe04894207bb2c6da.tar.gz |
core: nds32: add task_wait_event_mask() function to nds32 core
[task]
1. Copy task_wait_event_mask() function of cortex-m0.
[system]
2. Include host_command.h for host_command_pd_request_hibernate().
[i2c]
3. Update i2c handler to use task_wait_event_mask.
Signed-off-by: Dino Li <dino.li@ite.com.tw>
BRANCH=none
BUG=chromium:435611,chromium:435612
TEST=1. console commands: i2cscan, i2cxfer, and battery.
Change-Id: If5bb4407460d28c0b021ab133ca4b635ff7bc3c9
Reviewed-on: https://chromium-review.googlesource.com/320440
Commit-Ready: Dino Li <dino.li@ite.com.tw>
Tested-by: Dino Li <dino.li@ite.com.tw>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r-- | chip/it83xx/i2c.c | 3 | ||||
-rw-r--r-- | chip/it83xx/system.c | 1 | ||||
-rw-r--r-- | core/nds32/task.c | 32 |
3 files changed, 32 insertions, 4 deletions
diff --git a/chip/it83xx/i2c.c b/chip/it83xx/i2c.c index bc10a5970f..fe516bb41f 100644 --- a/chip/it83xx/i2c.c +++ b/chip/it83xx/i2c.c @@ -410,7 +410,8 @@ int chip_i2c_xfer(int port, int slave_addr, const uint8_t *out, int out_size, } /* Start transaction */ i2c_transaction(port); - events = task_wait_event(pd->timeout_us); + /* Wait for transfer complete or timeout */ + events = task_wait_event_mask(TASK_EVENT_I2C_IDLE, pd->timeout_us); /* disable i2c interrupt */ task_disable_irq(i2c_ctrl_regs[port].irq); pd->task_waiting = TASK_ID_INVALID; diff --git a/chip/it83xx/system.c b/chip/it83xx/system.c index 6019c5f41b..90e234ce86 100644 --- a/chip/it83xx/system.c +++ b/chip/it83xx/system.c @@ -9,6 +9,7 @@ #include "cpu.h" #include "ec2i_chip.h" #include "flash.h" +#include "host_command.h" #include "registers.h" #include "system.h" #include "task.h" diff --git a/core/nds32/task.c b/core/nds32/task.c index b34e9e9f50..4be65ac913 100644 --- a/core/nds32/task.c +++ b/core/nds32/task.c @@ -450,6 +450,34 @@ uint32_t task_wait_event(int timeout_us) return __wait_evt(timeout_us, TASK_ID_IDLE); } +uint32_t task_wait_event_mask(uint32_t event_mask, int timeout_us) +{ + uint64_t deadline = get_time().val + timeout_us; + uint32_t events = 0; + int time_remaining_us = timeout_us; + + /* Add the timer event to the mask so we can indicate a timeout */ + event_mask |= TASK_EVENT_TIMER; + + while (!(events & event_mask)) { + /* Collect events to re-post later */ + events |= __wait_evt(time_remaining_us, TASK_ID_IDLE); + + time_remaining_us = deadline - get_time().val; + if (timeout_us > 0 && time_remaining_us <= 0) { + /* Ensure we return a TIMER event if we timeout */ + events |= TASK_EVENT_TIMER; + break; + } + } + + /* Re-post any other events collected */ + if (events & ~event_mask) + atomic_or(¤t_task->events, events & ~event_mask); + + return events & event_mask; +} + uint32_t get_int_mask(void) { uint32_t ret; @@ -577,9 +605,7 @@ void mutex_lock(struct mutex *mtx) /* end of critical section : re-enable interrupts */ interrupt_enable(); /* Sleep waiting for our turn */ - /* TODO(crbug.com/435612, crbug.com/435611) - * This discards any pending events! */ - task_wait_event(0); + task_wait_event_mask(TASK_EVENT_MUTEX, 0); /* re-enter critical section */ interrupt_disable(); } |