summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorAnton Staaf <robotboy@chromium.org>2016-03-23 12:45:28 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-04-18 17:32:40 -0700
commit068cd0850684ee28a5a514e5a270edce2edb3979 (patch)
treee84f2316e37baa72f1c9611e665749d91a3ce8fd /common
parent1e7c280491232110e1006d545f9a61ca05d469d5 (diff)
downloadchrome-ec-068cd0850684ee28a5a514e5a270edce2edb3979.tar.gz
Deferred: Use deferred_data instead of function pointer
Previously calls to hook_call_deferred were passed the function to call, which was then looked up in the .rodata.deferred section with a linear search. This linear search can be replaced with a subtract by passing the pointer to the deferred_data object created when DECLARE_DEFERRED was invoked. Signed-off-by: Anton Staaf <robotboy@chromium.org> BRANCH=None BUG=None CQ-DEPEND=CL:*255812 TEST=make buildall -j Change-Id: I951dd1541302875b102dd086154cf05591694440 Reviewed-on: https://chromium-review.googlesource.com/334315 Commit-Ready: Bill Richardson <wfrichar@chromium.org> Tested-by: Bill Richardson <wfrichar@chromium.org> Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/acpi.c4
-rw-r--r--common/ap_hang_detect.c10
-rw-r--r--common/battery.c4
-rw-r--r--common/button.c9
-rw-r--r--common/capsense.c4
-rw-r--r--common/charge_manager.c20
-rw-r--r--common/extpower_gpio.c2
-rw-r--r--common/hooks.c14
-rw-r--r--common/inductive_charging.c8
-rw-r--r--common/lid_switch.c4
-rw-r--r--common/power_button.c7
-rw-r--r--common/switch.c2
-rw-r--r--common/uart_buffering.c7
-rw-r--r--common/usb_pd_policy.c2
-rw-r--r--common/usb_pd_protocol.c5
-rw-r--r--common/vboot_hash.c13
16 files changed, 58 insertions, 57 deletions
diff --git a/common/acpi.c b/common/acpi.c
index 904c6fe055..58bb658a84 100644
--- a/common/acpi.c
+++ b/common/acpi.c
@@ -254,7 +254,7 @@ int acpi_ap_to_ec(int is_cmd, uint8_t value, uint8_t *resultptr)
* Disable from deferred function in case burst mode is enabled
* for an extremely long time (ex. kernel bug / crash).
*/
- hook_call_deferred(acpi_disable_burst_deferred, 1*SECOND);
+ hook_call_deferred(&acpi_disable_burst_deferred_data, 1*SECOND);
/* ACPI 5.0-12.3.3: Burst ACK */
*resultptr = 0x90;
@@ -263,7 +263,7 @@ int acpi_ap_to_ec(int is_cmd, uint8_t value, uint8_t *resultptr)
acpi_read_cache.enabled = 0;
/* Leave burst mode */
- hook_call_deferred(acpi_disable_burst_deferred, -1);
+ hook_call_deferred(&acpi_disable_burst_deferred_data, -1);
lpc_clear_acpi_status_mask(EC_LPC_STATUS_BURST_MODE);
}
diff --git a/common/ap_hang_detect.c b/common/ap_hang_detect.c
index 2957365211..08bcff036a 100644
--- a/common/ap_hang_detect.c
+++ b/common/ap_hang_detect.c
@@ -28,6 +28,9 @@ static int timeout_will_reboot; /* Will the deferred call reboot the AP? */
/**
* Handle the hang detect timer expiring.
*/
+static void hang_detect_deferred(void);
+DECLARE_DEFERRED(hang_detect_deferred);
+
static void hang_detect_deferred(void)
{
/* If we're no longer active, nothing to do */
@@ -51,7 +54,7 @@ static void hang_detect_deferred(void)
if (hdparams.warm_reboot_timeout_msec) {
CPRINTS("hang detect continuing (for reboot)");
timeout_will_reboot = 1;
- hook_call_deferred(hang_detect_deferred,
+ hook_call_deferred(&hang_detect_deferred_data,
(hdparams.warm_reboot_timeout_msec -
hdparams.host_event_timeout_msec) * MSEC);
} else {
@@ -59,7 +62,6 @@ static void hang_detect_deferred(void)
active = 0;
}
}
-DECLARE_DEFERRED(hang_detect_deferred);
/**
* Start the hang detect timers.
@@ -74,13 +76,13 @@ static void hang_detect_start(const char *why)
CPRINTS("hang detect started on %s (for event)", why);
timeout_will_reboot = 0;
active = 1;
- hook_call_deferred(hang_detect_deferred,
+ hook_call_deferred(&hang_detect_deferred_data,
hdparams.host_event_timeout_msec * MSEC);
} else if (hdparams.warm_reboot_timeout_msec) {
CPRINTS("hang detect started on %s (for reboot)", why);
timeout_will_reboot = 1;
active = 1;
- hook_call_deferred(hang_detect_deferred,
+ hook_call_deferred(&hang_detect_deferred_data,
hdparams.warm_reboot_timeout_msec * MSEC);
}
}
diff --git a/common/battery.c b/common/battery.c
index 408ae92c46..ae3d548676 100644
--- a/common/battery.c
+++ b/common/battery.c
@@ -294,7 +294,7 @@ static void clear_pending_cutoff(void)
{
if (extpower_is_present()) {
battery_cutoff_state = BATTERY_CUTOFF_STATE_NORMAL;
- hook_call_deferred(pending_cutoff_deferred, -1);
+ hook_call_deferred(&pending_cutoff_deferred_data, -1);
}
}
DECLARE_HOOK(HOOK_AC_CHANGE, clear_pending_cutoff, HOOK_PRIO_DEFAULT);
@@ -331,7 +331,7 @@ static void check_pending_cutoff(void)
if (battery_cutoff_state == BATTERY_CUTOFF_STATE_PENDING) {
CPRINTF("[%T Cutting off battery in %d second(s)]\n",
CONFIG_BATTERY_CUTOFF_DELAY_US / SECOND);
- hook_call_deferred(pending_cutoff_deferred,
+ hook_call_deferred(&pending_cutoff_deferred_data,
CONFIG_BATTERY_CUTOFF_DELAY_US);
}
}
diff --git a/common/button.c b/common/button.c
index 89e6d409e2..38f5a61403 100644
--- a/common/button.c
+++ b/common/button.c
@@ -57,6 +57,10 @@ DECLARE_HOOK(HOOK_INIT, button_init, HOOK_PRIO_DEFAULT);
/*
* Handle debounced button changing state.
*/
+
+static void button_change_deferred(void);
+DECLARE_DEFERRED(button_change_deferred);
+
static void button_change_deferred(void)
{
int i;
@@ -99,11 +103,10 @@ static void button_change_deferred(void)
if (soonest_debounce_time != 0) {
next_deferred_time = soonest_debounce_time;
- hook_call_deferred(button_change_deferred,
+ hook_call_deferred(&button_change_deferred_data,
next_deferred_time - time_now);
}
}
-DECLARE_DEFERRED(button_change_deferred);
/*
* Handle a button interrupt.
@@ -121,7 +124,7 @@ void button_interrupt(enum gpio_signal signal)
if (next_deferred_time <= time_now ||
next_deferred_time > state[i].debounce_time) {
next_deferred_time = state[i].debounce_time;
- hook_call_deferred(button_change_deferred,
+ hook_call_deferred(&button_change_deferred_data,
next_deferred_time - time_now);
}
break;
diff --git a/common/capsense.c b/common/capsense.c
index 95703931bd..bc54d5aae3 100644
--- a/common/capsense.c
+++ b/common/capsense.c
@@ -73,7 +73,7 @@ static void capsense_change_deferred(void)
}
if (cur_val)
- hook_call_deferred(capsense_change_deferred,
+ hook_call_deferred(&capsense_change_deferred_data,
CAPSENSE_POLL_INTERVAL);
}
DECLARE_DEFERRED(capsense_change_deferred);
@@ -83,5 +83,5 @@ DECLARE_DEFERRED(capsense_change_deferred);
*/
void capsense_interrupt(enum gpio_signal signal)
{
- hook_call_deferred(capsense_change_deferred, 0);
+ hook_call_deferred(&capsense_change_deferred_data, 0);
}
diff --git a/common/charge_manager.c b/common/charge_manager.c
index 7063d0540f..fa015086da 100644
--- a/common/charge_manager.c
+++ b/common/charge_manager.c
@@ -662,9 +662,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change,
override_port = OVERRIDE_OFF;
if (delayed_override_port != OVERRIDE_OFF) {
delayed_override_port = OVERRIDE_OFF;
- hook_call_deferred(
- charge_override_timeout,
- -1);
+ hook_call_deferred(&charge_override_timeout_data, -1);
}
}
@@ -682,7 +680,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change,
* just sent due to the power change on another port.
*/
if (charge->current > 0)
- hook_call_deferred(charger_detect_debounced,
+ hook_call_deferred(&charger_detect_debounced_data,
CHARGE_DETECT_DELAY);
/*
@@ -693,7 +691,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change,
pd_get_role(delayed_override_port) == PD_ROLE_SINK &&
get_time().val < delayed_override_deadline.val) {
delayed_override_port = OVERRIDE_OFF;
- hook_call_deferred(charge_override_timeout, -1);
+ hook_call_deferred(&charge_override_timeout_data, -1);
charge_manager_set_override(port);
}
}
@@ -705,7 +703,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change,
* attached.
*/
if (charge_manager_is_seeded())
- hook_call_deferred(charge_manager_refresh, 0);
+ hook_call_deferred(&charge_manager_refresh_data, 0);
}
/**
@@ -762,7 +760,7 @@ void charge_manager_set_ceil(int port, enum ceil_requestor requestor, int ceil)
if (charge_ceil[port][requestor] != ceil) {
charge_ceil[port][requestor] = ceil;
if (port == charge_port && charge_manager_is_seeded())
- hook_call_deferred(charge_manager_refresh, 0);
+ hook_call_deferred(&charge_manager_refresh_data, 0);
}
}
@@ -798,7 +796,8 @@ int charge_manager_set_override(int port)
if (override_port != port) {
override_port = port;
if (charge_manager_is_seeded())
- hook_call_deferred(charge_manager_refresh, 0);
+ hook_call_deferred(
+ &charge_manager_refresh_data, 0);
}
}
/*
@@ -810,9 +809,8 @@ int charge_manager_set_override(int port)
delayed_override_deadline.val = get_time().val +
POWER_SWAP_TIMEOUT;
delayed_override_port = port;
- hook_call_deferred(
- charge_override_timeout,
- POWER_SWAP_TIMEOUT);
+ hook_call_deferred(&charge_override_timeout_data,
+ POWER_SWAP_TIMEOUT);
pd_request_power_swap(port);
/* Can't charge from requested port -- return error. */
} else
diff --git a/common/extpower_gpio.c b/common/extpower_gpio.c
index b73d748701..569d674157 100644
--- a/common/extpower_gpio.c
+++ b/common/extpower_gpio.c
@@ -45,7 +45,7 @@ DECLARE_DEFERRED(extpower_deferred);
void extpower_interrupt(enum gpio_signal signal)
{
/* Trigger deferred notification of external power change */
- hook_call_deferred(extpower_deferred, EXTPOWER_DEBOUNCE_US);
+ hook_call_deferred(&extpower_deferred_data, EXTPOWER_DEBOUNCE_US);
}
static void extpower_init(void)
diff --git a/common/hooks.c b/common/hooks.c
index f8e368c36d..1a1a1aa819 100644
--- a/common/hooks.c
+++ b/common/hooks.c
@@ -132,21 +132,13 @@ void hook_notify(enum hook_type type)
#endif
}
-int hook_call_deferred(void (*routine)(void), int us)
+int hook_call_deferred(const struct deferred_data *data, int us)
{
- const struct deferred_data *p;
- int i;
+ int i = data - __deferred_funcs;
- /* Find the index of the routine */
- for (p = __deferred_funcs; p < __deferred_funcs_end; p++) {
- if (p->routine == routine)
- break;
- }
- if (p >= __deferred_funcs_end)
+ if (data < __deferred_funcs || data >= __deferred_funcs_end)
return EC_ERROR_INVAL; /* Routine not registered */
- i = p - __deferred_funcs;
-
if (us == -1) {
/* Cancel */
defer_until[i] = 0;
diff --git a/common/inductive_charging.c b/common/inductive_charging.c
index 8b92394c8c..793f535afe 100644
--- a/common/inductive_charging.c
+++ b/common/inductive_charging.c
@@ -73,8 +73,9 @@ void inductive_charging_interrupt(enum gpio_signal signal)
* looking at CHARGE_DONE.
*/
if (!monitor_charge_done)
- hook_call_deferred(inductive_charging_monitor_charge,
- SECOND);
+ hook_call_deferred(
+ &inductive_charging_monitor_charge_data,
+ SECOND);
}
}
@@ -93,7 +94,8 @@ static void inductive_charging_lid_update(void)
* unaligned. Delay here to give the coils time to align before
* we try to clear CHARGE_DONE.
*/
- hook_call_deferred(inductive_charging_deferred_update, 5 * SECOND);
+ hook_call_deferred(&inductive_charging_deferred_update_data,
+ 5 * SECOND);
}
DECLARE_HOOK(HOOK_LID_CHANGE, inductive_charging_lid_update, HOOK_PRIO_DEFAULT);
diff --git a/common/lid_switch.c b/common/lid_switch.c
index eefd2bdfa1..f5af903936 100644
--- a/common/lid_switch.c
+++ b/common/lid_switch.c
@@ -113,7 +113,7 @@ DECLARE_DEFERRED(lid_change_deferred);
void lid_interrupt(enum gpio_signal signal)
{
/* Reset lid debounce time */
- hook_call_deferred(lid_change_deferred, LID_DEBOUNCE_US);
+ hook_call_deferred(&lid_change_deferred_data, LID_DEBOUNCE_US);
}
static int command_lidopen(int argc, char **argv)
@@ -147,7 +147,7 @@ static int hc_force_lid_open(struct host_cmd_handler_args *args)
forced_lid_open = p->enabled ? 1 : 0;
/* Make this take effect immediately; no debounce time */
- hook_call_deferred(lid_change_deferred, 0);
+ hook_call_deferred(&lid_change_deferred_data, 0);
return EC_RES_SUCCESS;
}
diff --git a/common/power_button.c b/common/power_button.c
index e2914bc362..747be2381e 100644
--- a/common/power_button.c
+++ b/common/power_button.c
@@ -156,7 +156,8 @@ void power_button_interrupt(enum gpio_signal signal)
/* Reset power button debounce time */
power_button_is_stable = 0;
- hook_call_deferred(power_button_change_deferred, PWRBTN_DEBOUNCE_US);
+ hook_call_deferred(&power_button_change_deferred_data,
+ PWRBTN_DEBOUNCE_US);
}
/*****************************************************************************/
@@ -176,14 +177,14 @@ static int command_powerbtn(int argc, char **argv)
ccprintf("Simulating %d ms power button press.\n", ms);
simulate_power_pressed = 1;
power_button_is_stable = 0;
- hook_call_deferred(power_button_change_deferred, 0);
+ hook_call_deferred(&power_button_change_deferred_data, 0);
msleep(ms);
ccprintf("Simulating power button release.\n");
simulate_power_pressed = 0;
power_button_is_stable = 0;
- hook_call_deferred(power_button_change_deferred, 0);
+ hook_call_deferred(&power_button_change_deferred_data, 0);
return EC_SUCCESS;
}
diff --git a/common/switch.c b/common/switch.c
index fb854f63e9..811e4f7d2d 100644
--- a/common/switch.c
+++ b/common/switch.c
@@ -98,7 +98,7 @@ DECLARE_HOOK(HOOK_INIT, switch_init, HOOK_PRIO_DEFAULT);
void switch_interrupt(enum gpio_signal signal)
{
- hook_call_deferred(switch_update, 0);
+ hook_call_deferred(&switch_update_data, 0);
}
static int command_mmapinfo(int argc, char **argv)
diff --git a/common/uart_buffering.c b/common/uart_buffering.c
index 949c3968d6..c750a1ef6e 100644
--- a/common/uart_buffering.c
+++ b/common/uart_buffering.c
@@ -167,6 +167,9 @@ void uart_process_output(void)
#ifdef CONFIG_UART_RX_DMA
+void uart_process_input(void);
+DECLARE_DEFERRED(uart_process_input);
+
void uart_process_input(void)
{
static int fast_rechecks;
@@ -208,11 +211,11 @@ void uart_process_input(void)
*/
if (fast_rechecks) {
fast_rechecks--;
- hook_call_deferred(uart_process_input, RX_DMA_RECHECK_INTERVAL);
+ hook_call_deferred(&uart_process_input_data,
+ RX_DMA_RECHECK_INTERVAL);
}
}
DECLARE_HOOK(HOOK_TICK, uart_process_input, HOOK_PRIO_DEFAULT);
-DECLARE_DEFERRED(uart_process_input);
#else /* !CONFIG_UART_RX_DMA */
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index a071f8b767..074d07dc00 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -783,7 +783,7 @@ int pd_vdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
}
#endif /* !CONFIG_USB_PD_CUSTOM_VDM */
-void pd_usb_billboard_deferred(void)
+static void pd_usb_billboard_deferred(void)
{
#if defined(CONFIG_USB_PD_ALT_MODE) && !defined(CONFIG_USB_PD_ALT_MODE_DFP) \
&& !defined(CONFIG_USB_PD_SIMPLE_DFP) && defined(CONFIG_USB_BOS)
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index e8540d9dca..276698710d 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -2095,9 +2095,8 @@ void pd_task(void)
PD_FLAGS_DATA_SWAPPED;
set_state(port, PD_STATE_SNK_DISCOVERY);
timeout = 10*MSEC;
- hook_call_deferred(
- pd_usb_billboard_deferred,
- PD_T_AME);
+ hook_call_deferred(&pd_usb_billboard_deferred_data,
+ PD_T_AME);
break;
case PD_STATE_SNK_HARD_RESET_RECOVER:
if (pd[port].last_state != pd[port].task_state)
diff --git a/common/vboot_hash.c b/common/vboot_hash.c
index 01af769ebf..0a70b006b9 100644
--- a/common/vboot_hash.c
+++ b/common/vboot_hash.c
@@ -63,9 +63,10 @@ void vboot_hash_abort(void)
}
}
-#ifndef CONFIG_MAPPED_STORAGE
-
static void vboot_hash_next_chunk(void);
+DECLARE_DEFERRED(vboot_hash_next_chunk);
+
+#ifndef CONFIG_MAPPED_STORAGE
static int read_and_hash_chunk(int offset, int size)
{
@@ -78,7 +79,8 @@ static int read_and_hash_chunk(int offset, int size)
rv = shared_mem_acquire(size, &buf);
if (rv == EC_ERROR_BUSY) {
/* Couldn't update hash right now; try again later */
- hook_call_deferred(vboot_hash_next_chunk, WORK_INTERVAL_US);
+ hook_call_deferred(&vboot_hash_next_chunk_data,
+ WORK_INTERVAL_US);
return rv;
} else if (rv != EC_SUCCESS) {
vboot_hash_abort();
@@ -138,9 +140,8 @@ static void vboot_hash_next_chunk(void)
}
/* If we're still here, more work to do; come back later */
- hook_call_deferred(vboot_hash_next_chunk, WORK_INTERVAL_US);
+ hook_call_deferred(&vboot_hash_next_chunk_data, WORK_INTERVAL_US);
}
-DECLARE_DEFERRED(vboot_hash_next_chunk);
/**
* Start computing a hash of <size> bytes of data at flash offset <offset>.
@@ -178,7 +179,7 @@ static int vboot_hash_start(uint32_t offset, uint32_t size,
if (nonce_size)
SHA256_update(&ctx, nonce, nonce_size);
- hook_call_deferred(vboot_hash_next_chunk, 0);
+ hook_call_deferred(&vboot_hash_next_chunk_data, 0);
return EC_SUCCESS;
}