summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-02-23 14:42:42 +0800
committerChromeBot <chrome-bot@google.com>2013-02-25 18:59:56 -0800
commit9aba3baf15c02f252ba39f7817f94d74c89ec9ad (patch)
tree1a31bc9da1b49fbb0ff50e6baa0c03c7151621d8
parentc1b16d21e6315d6de9f697ff5a41eca288f4f754 (diff)
downloadchrome-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.c4
-rw-r--r--common/tsu6721.c14
-rw-r--r--include/tsu6721.h4
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);