diff options
author | Vic Yang <victoryang@chromium.org> | 2013-02-23 14:42:42 +0800 |
---|---|---|
committer | ChromeBot <chrome-bot@google.com> | 2013-02-25 18:59:56 -0800 |
commit | 9aba3baf15c02f252ba39f7817f94d74c89ec9ad (patch) | |
tree | 1a31bc9da1b49fbb0ff50e6baa0c03c7151621d8 | |
parent | c1b16d21e6315d6de9f697ff5a41eca288f4f754 (diff) | |
download | chrome-ec-9aba3baf15c02f252ba39f7817f94d74c89ec9ad.tar.gz |
spring: minimize the window that loses TSU6721 interrupt
Since TSU6721 processing is integrated into PMU task, an interrupt
closely following previous one may be dropped. We should check interrupt
status before yeilding control.
BUG=chrome-os-partner:14319, chrome-os-partner:14318
TEST=Boot on Spring. Check TSU6721 functionality.
BRANCH=none
Change-Id: I7ce1c70a214bb4afc9456eb206203cc6c3fe2f33
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/43862
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | common/pmu_tps65090_charger.c | 4 | ||||
-rw-r--r-- | common/tsu6721.c | 14 | ||||
-rw-r--r-- | include/tsu6721.h | 4 |
3 files changed, 20 insertions, 2 deletions
diff --git a/common/pmu_tps65090_charger.c b/common/pmu_tps65090_charger.c index 4881de5aa7..f33ab2099b 100644 --- a/common/pmu_tps65090_charger.c +++ b/common/pmu_tps65090_charger.c @@ -492,6 +492,10 @@ void pmu_charger_task(void) } } +#ifdef CONFIG_TSU6721 + has_pending_event |= tsu6721_peek_interrupts(); +#endif + if (!has_pending_event) { task_wait_event(wait_time); disable_sleep(SLEEP_MASK_CHARGING); diff --git a/common/tsu6721.c b/common/tsu6721.c index 8ea369c463..95a63a76bf 100644 --- a/common/tsu6721.c +++ b/common/tsu6721.c @@ -24,6 +24,8 @@ /* 8-bit I2C address */ #define TSU6721_I2C_ADDR (0x25 << 1) +static int saved_interrupts; + uint8_t tsu6721_read(uint8_t reg) { int res; @@ -65,8 +67,16 @@ void tsu6721_set_interrupt_mask(uint16_t mask) int tsu6721_get_interrupts(void) { - return (tsu6721_read(TSU6721_REG_INT1) << 8) | - (tsu6721_read(TSU6721_REG_INT2)); + int ret = tsu6721_peek_interrupts(); + saved_interrupts = 0; + return ret; +} + +int tsu6721_peek_interrupts(void) +{ + saved_interrupts |= (tsu6721_read(TSU6721_REG_INT1) << 8) | + (tsu6721_read(TSU6721_REG_INT2)); + return saved_interrupts; } int tsu6721_get_device_type(void) diff --git a/include/tsu6721.h b/include/tsu6721.h index 66bf5b6a33..619465453b 100644 --- a/include/tsu6721.h +++ b/include/tsu6721.h @@ -94,6 +94,10 @@ void tsu6721_set_interrupt_mask(uint16_t mask); * TSU6721_INT_* */ int tsu6721_get_interrupts(void); +/* Get but keep interrupt status. Return value is a combination of + * TSU6721_INT_* */ +int tsu6721_peek_interrupts(void); + /* Get attached device type. Return value is one or a combination of * TSU6721_TYPE_* */ int tsu6721_get_device_type(void); |