tps65090: Throttle PMU interrupt instead of charger task

This is a prepartory work for integrating USB port control into PMU
task.

Currently TPS65090 charger task is throttled to only waken by event once
per 500 ms. This in a way makes it hard to integrate other functionality
into this task. This CL moves the throttling mechanism to interrupt
handler so as to provide better control of when to throttle the
interrupt event.

BUG=chrome-os-partner:14319
TEST=Build success and boot on spring.
BRANCH=none

Change-Id: I72e63180442b379a379e1a87c10ef62395434872
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/40189
Reviewed-by: Rong Chang <rongchang@chromium.org>
This commit is contained in:
Vic Yang
2012-12-22 00:46:57 +08:00
committed by ChromeBot
parent d4fc07c1c2
commit 6eb8a6e999
3 changed files with 34 additions and 12 deletions

View File

@@ -403,7 +403,7 @@ void pmu_irq_handler(enum gpio_signal signal)
#ifdef CONFIG_AC_POWER_STATUS
gpio_set_level(GPIO_AC_STATUS, board_get_ac());
#endif
task_wake(TASK_ID_PMU_TPS65090_CHARGER);
pmu_task_throttled_wake();
CPRINTF("Charger IRQ received.\n");
}

View File

@@ -57,6 +57,10 @@ static const char * const state_list[] = {
"discharging"
};
/* States for throttling PMU task */
static timestamp_t last_waken; /* Initialized to 0 */
static int has_pending_event;
static void enable_charging(int enable)
{
enable = enable ? 1 : 0;
@@ -372,7 +376,6 @@ void pmu_charger_task(void)
{
int state = ST_IDLE;
int next_state;
int event = 0;
int wait_time = T1_USEC;
unsigned int pre_charging_count = 0;
@@ -386,6 +389,7 @@ void pmu_charger_task(void)
disable_sleep(SLEEP_MASK_CHARGING);
while (1) {
last_waken = get_time();
pmu_clear_irq();
/*
@@ -466,24 +470,39 @@ void pmu_charger_task(void)
}
}
/*
* Throttle the charging loop. If previous loop awakened due to
* an event, sleep 500 ms instead of waiting for next event.
*/
if (event & TASK_EVENT_WAKE) {
msleep(500);
event = 0;
} else {
event = task_wait_event(wait_time);
if (!has_pending_event) {
task_wait_event(wait_time);
disable_sleep(SLEEP_MASK_CHARGING);
} else {
has_pending_event = 0;
}
}
}
void pmu_task_throttled_wake(void)
{
timestamp_t now = get_time();
if (now.val - last_waken.val >= HOOK_TICK_INTERVAL) {
has_pending_event = 0;
task_wake(TASK_ID_PMU_TPS65090_CHARGER);
} else {
has_pending_event = 1;
}
}
static void wake_pmu_task_if_necessary(void)
{
if (has_pending_event) {
has_pending_event = 0;
task_wake(TASK_ID_PMU_TPS65090_CHARGER);
}
}
DECLARE_HOOK(HOOK_TICK, wake_pmu_task_if_necessary, HOOK_PRIO_DEFAULT);
/* Wake charging task on chipset events */
static void pmu_chipset_events(void)
{
task_wake(TASK_ID_PMU_TPS65090_CHARGER);
pmu_task_throttled_wake();
}
DECLARE_HOOK(HOOK_CHIPSET_STARTUP, pmu_chipset_events, HOOK_PRIO_DEFAULT);
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, pmu_chipset_events, HOOK_PRIO_DEFAULT);

View File

@@ -224,5 +224,8 @@ int board_get_ac(void);
*/
void board_hard_reset(void);
/* Wake TPS65090 charger task, but throttled to at most one call per tick. */
void pmu_task_throttled_wake(void);
#endif /* __CROS_EC_TPSCHROME_H */