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>
This commit is contained in:
Anton Staaf
2016-03-23 12:45:28 -07:00
committed by chrome-bot
parent 1e7c280491
commit 068cd08506
58 changed files with 230 additions and 195 deletions

View File

@@ -85,10 +85,11 @@ void usb1_evt(enum gpio_signal signal)
* state of GPIOs, so its definition must reside after including gpio_list.
*/
static void enable_input_devices(void);
DECLARE_DEFERRED(enable_input_devices);
void tablet_mode_interrupt(enum gpio_signal signal)
{
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
#include "gpio_list.h"
@@ -301,19 +302,18 @@ static void enable_input_devices(void)
keyboard_scan_enable(kb_enable, KB_SCAN_DISABLE_LID_ANGLE);
gpio_set_level(GPIO_ENABLE_TOUCHPAD, tp_enable);
}
DECLARE_DEFERRED(enable_input_devices);
/* Called on AP S5 -> S3 transition */
static void board_chipset_startup(void)
{
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_STARTUP, board_chipset_startup, HOOK_PRIO_DEFAULT);
/* Called on AP S3 -> S5 transition */
static void board_chipset_shutdown(void)
{
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT);

View File

@@ -303,8 +303,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -308,8 +308,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -74,7 +74,7 @@ void hpd_event(enum gpio_signal signal)
hpd_prev_ts = now.val;
/* All previous hpd level events need to be re-triggered */
hook_call_deferred(hpd_lvl_deferred, -1);
hook_call_deferred(&hpd_lvl_deferred_data, -1);
/* It's a glitch. Previous time moves but level is the same. */
if (cur_delta < HPD_USTREAM_DEBOUNCE_IRQ)
@@ -83,9 +83,10 @@ void hpd_event(enum gpio_signal signal)
if ((!hpd_prev_level && level) &&
(cur_delta < HPD_USTREAM_DEBOUNCE_LVL))
/* It's an irq */
hook_call_deferred(hpd_irq_deferred, 0);
hook_call_deferred(&hpd_irq_deferred_data, 0);
else if (cur_delta >= HPD_USTREAM_DEBOUNCE_LVL)
hook_call_deferred(hpd_lvl_deferred, HPD_USTREAM_DEBOUNCE_LVL);
hook_call_deferred(&hpd_lvl_deferred_data,
HPD_USTREAM_DEBOUNCE_LVL);
hpd_prev_level = level;
}

View File

@@ -171,23 +171,25 @@ static struct mutex dp_hw_lock;
* Reset PD MCU
* ANX7688 needs a reset pulse of 50ms after power enable.
*/
void deferred_reset_pd_mcu(void);
DECLARE_DEFERRED(deferred_reset_pd_mcu);
void deferred_reset_pd_mcu(void)
{
if (!gpio_get_level(GPIO_USB_C0_RST)) {
gpio_set_level(GPIO_USB_C0_RST, 1);
hook_call_deferred(deferred_reset_pd_mcu, 50 * MSEC);
hook_call_deferred(&deferred_reset_pd_mcu_data, 50 * MSEC);
} else {
gpio_set_level(GPIO_USB_C0_RST, 0);
}
}
DECLARE_DEFERRED(deferred_reset_pd_mcu);
void board_reset_pd_mcu(void)
{
/* Perform ANX7688 startup sequence */
gpio_set_level(GPIO_USB_C0_PWR_EN_L, 0);
gpio_set_level(GPIO_USB_C0_RST, 0);
hook_call_deferred(deferred_reset_pd_mcu, 0);
hook_call_deferred(&deferred_reset_pd_mcu_data, 0);
}
/**
@@ -357,7 +359,7 @@ void board_typec_dp_on(int port)
board_typec_set_dp_hpd(port, 1);
} else {
board_typec_set_dp_hpd(port, 0);
hook_call_deferred(hpd_irq_deferred,
hook_call_deferred(&hpd_irq_deferred_data,
HPD_DSTREAM_DEBOUNCE_IRQ);
}
}
@@ -431,7 +433,7 @@ DECLARE_DEFERRED(tmp432_set_power_deferred);
static void board_extpower(void)
{
board_extpower_buffer_to_soc();
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
}
DECLARE_HOOK(HOOK_AC_CHANGE, board_extpower, HOOK_PRIO_DEFAULT);
@@ -454,14 +456,14 @@ DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT);
/* Called on AP S3 -> S0 transition */
static void board_chipset_resume(void)
{
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT);
/* Called on AP S0 -> S3 transition */
static void board_chipset_suspend(void)
{
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT);

View File

@@ -88,10 +88,11 @@ void usb1_evt(enum gpio_signal signal)
* state of GPIOs, so its definition must reside after including gpio_list.
*/
static void enable_input_devices(void);
DECLARE_DEFERRED(enable_input_devices);
void tablet_mode_interrupt(enum gpio_signal signal)
{
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
#include "gpio_list.h"
@@ -380,14 +381,13 @@ static void enable_input_devices(void)
keyboard_scan_enable(kb_enable, KB_SCAN_DISABLE_LID_ANGLE);
gpio_set_level(GPIO_ENABLE_TOUCHPAD, tp_enable);
}
DECLARE_DEFERRED(enable_input_devices);
/* Called on AP S5 -> S3 transition */
static void board_chipset_startup(void)
{
gpio_set_level(GPIO_USB1_ENABLE, 1);
gpio_set_level(GPIO_USB2_ENABLE, 1);
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_STARTUP, board_chipset_startup, HOOK_PRIO_DEFAULT);
@@ -396,7 +396,7 @@ static void board_chipset_shutdown(void)
{
gpio_set_level(GPIO_USB1_ENABLE, 0);
gpio_set_level(GPIO_USB2_ENABLE, 0);
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT);

View File

@@ -304,8 +304,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -141,7 +141,7 @@ static int ec_status_host_cmd(struct host_cmd_handler_args *args)
/* Have the PD follow the EC into hibernate. */
if (p->status & EC_STATUS_HIBERNATING)
hook_call_deferred(system_hibernate_deferred, 0);
hook_call_deferred(&system_hibernate_deferred_data, 0);
/*
* If the source of the EC int line was HOST_EVENT, it has

View File

@@ -76,7 +76,7 @@ void hpd_event(enum gpio_signal signal)
hpd_prev_ts = now.val;
/* All previous hpd level events need to be re-triggered */
hook_call_deferred(hpd_lvl_deferred, -1);
hook_call_deferred(&hpd_lvl_deferred_data, -1);
/* It's a glitch. Previous time moves but level is the same. */
if (cur_delta < HPD_USTREAM_DEBOUNCE_IRQ)
@@ -85,9 +85,10 @@ void hpd_event(enum gpio_signal signal)
if ((!hpd_prev_level && level) &&
(cur_delta < HPD_USTREAM_DEBOUNCE_LVL))
/* It's an irq */
hook_call_deferred(hpd_irq_deferred, 0);
hook_call_deferred(&hpd_irq_deferred_data, 0);
else if (cur_delta >= HPD_USTREAM_DEBOUNCE_LVL)
hook_call_deferred(hpd_lvl_deferred, HPD_USTREAM_DEBOUNCE_LVL);
hook_call_deferred(&hpd_lvl_deferred_data,
HPD_USTREAM_DEBOUNCE_LVL);
hpd_prev_level = level;
}
@@ -167,7 +168,7 @@ static void board_init(void)
gpio_set_level(GPIO_STM_READY, 1); /* factory test only */
/* Delay needed to allow HDMI MCU to boot. */
hook_call_deferred(factory_validation_deferred, 200*MSEC);
hook_call_deferred(&factory_validation_deferred_data, 200*MSEC);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);

View File

@@ -81,7 +81,7 @@ void hpd_event(enum gpio_signal signal)
hpd_prev_ts = now.val;
/* All previous hpd level events need to be re-triggered */
hook_call_deferred(hpd_lvl_deferred, -1);
hook_call_deferred(&hpd_lvl_deferred_data, -1);
/* It's a glitch. Previous time moves but level is the same. */
if (cur_delta < HPD_USTREAM_DEBOUNCE_IRQ)
@@ -90,9 +90,10 @@ void hpd_event(enum gpio_signal signal)
if ((!hpd_prev_level && level) &&
(cur_delta < HPD_USTREAM_DEBOUNCE_LVL))
/* It's an irq */
hook_call_deferred(hpd_irq_deferred, 0);
hook_call_deferred(&hpd_irq_deferred_data, 0);
else if (cur_delta >= HPD_USTREAM_DEBOUNCE_LVL)
hook_call_deferred(hpd_lvl_deferred, HPD_USTREAM_DEBOUNCE_LVL);
hook_call_deferred(&hpd_lvl_deferred_data,
HPD_USTREAM_DEBOUNCE_LVL);
hpd_prev_level = level;
}

View File

@@ -304,8 +304,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -311,7 +311,8 @@ static int svdm_dp_attention(int port, uint32_t *payload)
if (irq & cur_lvl) {
gpio_set_level(GPIO_USB_C0_DP_HPD, 0);
hook_call_deferred(hpd0_irq_deferred, HPD_DSTREAM_DEBOUNCE_IRQ);
hook_call_deferred(&hpd0_irq_deferred_data,
HPD_DSTREAM_DEBOUNCE_IRQ);
} else if (irq & !cur_lvl) {
CPRINTF("ERR:HPD:IRQ&LOW\n");
return 0; /* nak */

View File

@@ -135,7 +135,7 @@ static int ec_status_host_cmd(struct host_cmd_handler_args *args)
/* Have the PD follow the EC into hibernate. */
if (p->status & EC_STATUS_HIBERNATING)
hook_call_deferred(system_hibernate_deferred, 0);
hook_call_deferred(&system_hibernate_deferred_data, 0);
/*
* If the source of the EC int line was HOST_EVENT, it has

View File

@@ -105,7 +105,8 @@ void vbus_evt(enum gpio_signal signal)
* lucid only has one port and charging is always enabled.
*/
hook_call_deferred(usb_charger_bc12_detect, USB_CHG_DETECT_DELAY_US);
hook_call_deferred(&usb_charger_bc12_detect_data,
USB_CHG_DETECT_DELAY_US);
update_vbus_supplier(gpio_get_level(signal));
task_wake(TASK_ID_PD_C0);

View File

@@ -396,8 +396,8 @@ void board_typec_dp_on(int port)
board_typec_set_dp_hpd(port, 1);
} else {
board_typec_set_dp_hpd(port, 0);
hook_call_deferred(hpd_irq_deferred,
HPD_DSTREAM_DEBOUNCE_IRQ);
hook_call_deferred(&hpd_irq_deferred_data,
HPD_DSTREAM_DEBOUNCE_IRQ);
}
}
@@ -589,7 +589,7 @@ static void board_extpower(void)
{
board_extpower_buffer_to_soc();
#ifdef CONFIG_TEMP_SENSOR_TMP432
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
#endif
}
DECLARE_HOOK(HOOK_AC_CHANGE, board_extpower, HOOK_PRIO_DEFAULT);
@@ -625,7 +625,7 @@ DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT);
static void board_chipset_resume(void)
{
#ifdef CONFIG_TEMP_SENSOR_TMP432
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
#endif
}
DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT);
@@ -634,7 +634,7 @@ DECLARE_HOOK(HOOK_CHIPSET_RESUME, board_chipset_resume, HOOK_PRIO_DEFAULT);
static void board_chipset_suspend(void)
{
#ifdef CONFIG_TEMP_SENSOR_TMP432
hook_call_deferred(tmp432_set_power_deferred, 0);
hook_call_deferred(&tmp432_set_power_deferred_data, 0);
#endif
}
DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, board_chipset_suspend, HOOK_PRIO_DEFAULT);

View File

@@ -104,7 +104,8 @@ void hpd_event(enum gpio_signal signal)
hpd_prev_ts = now.val;
/* All previous hpd level events need to be re-triggered */
hook_call_deferred(hpd_lvl_deferred, HPD_USTREAM_DEBOUNCE_LVL);
hook_call_deferred(&hpd_lvl_deferred_data,
HPD_USTREAM_DEBOUNCE_LVL);
}
/* Debounce time for voltage buttons */
@@ -177,13 +178,17 @@ static void set_active_cc(int cc)
* is detected. If a type-C connection can be made in both polarities, then we
* have a double CC cable, otherwise we have a single CC cable.
*/
static void detect_cc_cable(void);
DECLARE_DEFERRED(detect_cc_cable);
static void detect_cc_cable(void)
{
/*
* Delay long enough to guarantee a type-C disconnect will be seen and
* a new connection will be made made.
*/
hook_call_deferred(detect_cc_cable, PD_T_CC_DEBOUNCE + PD_T_SAFE_0V);
hook_call_deferred(&detect_cc_cable_data,
PD_T_CC_DEBOUNCE + PD_T_SAFE_0V);
switch (cable) {
case TYPEC_CABLE_NONE:
@@ -210,7 +215,6 @@ static void detect_cc_cable(void)
break;
}
}
DECLARE_DEFERRED(detect_cc_cable);
static void fake_disconnect_end(void)
{
@@ -218,14 +222,14 @@ static void fake_disconnect_end(void)
board_pd_set_host_mode(fake_pd_host_mode);
/* Restart CC cable detection */
hook_call_deferred(detect_cc_cable, 500*MSEC);
hook_call_deferred(&detect_cc_cable_data, 500*MSEC);
}
DECLARE_DEFERRED(fake_disconnect_end);
static void fake_disconnect_start(void)
{
/* Cancel detection of CC cable */
hook_call_deferred(detect_cc_cable, -1);
hook_call_deferred(&detect_cc_cable_data, -1);
/* Record the current host mode */
fake_pd_host_mode = !gpio_get_level(GPIO_USBC_CHARGE_EN);
@@ -241,7 +245,7 @@ static void fake_disconnect_start(void)
fake_pd_disconnected = 1;
hook_call_deferred(fake_disconnect_end,
hook_call_deferred(&fake_disconnect_end_data,
fake_pd_disconnect_duration_us);
}
DECLARE_DEFERRED(fake_disconnect_start);
@@ -261,7 +265,7 @@ static void update_usbc_dual_role(int dual_role)
* since both CC lines are used and SRC/SNK changes are dictated
* by the USB PD protocol state machine.
*/
hook_call_deferred(detect_cc_cable, -1);
hook_call_deferred(&detect_cc_cable_data, -1);
/* Need to make sure both CC lines are set for SNK or SRC. */
set_active_cc(host_mode);
/* Ensure that PD communication is enabled. */
@@ -272,7 +276,7 @@ static void update_usbc_dual_role(int dual_role)
* Dualrole mode is not active, resume cable detect function
* which controls which CC line is active.
*/
hook_call_deferred(detect_cc_cable, 0);
hook_call_deferred(&detect_cc_cable_data, 0);
}
/* Update dual role setting used in USB PD protocol state machine */
pd_set_dual_role(dual_role);
@@ -335,10 +339,10 @@ static void set_usbc_action(enum usbc_action act)
* Fake a disconnection for long enough to guarantee
* that we disconnect.
*/
hook_call_deferred(fake_disconnect_start, -1);
hook_call_deferred(fake_disconnect_end, -1);
hook_call_deferred(&fake_disconnect_start_data, -1);
hook_call_deferred(&fake_disconnect_end_data, -1);
fake_pd_disconnect_duration_us = PD_T_SAFE_0V;
hook_call_deferred(fake_disconnect_start, 0);
hook_call_deferred(&fake_disconnect_start_data, 0);
set_active_cc(!active_cc);
}
break;
@@ -370,10 +374,13 @@ static void set_usbc_action(enum usbc_action act)
/* has Pull-up */
static int prev_dbg20v = 1;
static void button_dbg20v_deferred(void);
DECLARE_DEFERRED(button_dbg20v_deferred);
static void enable_dbg20v_poll(void)
{
hook_call_deferred(button_dbg20v_deferred, 10 * MSEC);
hook_call_deferred(&button_dbg20v_deferred_data, 10 * MSEC);
}
/* Handle debounced button press */
@@ -427,7 +434,7 @@ void button_event(enum gpio_signal signal)
{
button_pressed = signal;
/* reset debounce time */
hook_call_deferred(button_deferred, BUTTON_DEBOUNCE_US);
hook_call_deferred(&button_deferred_data, BUTTON_DEBOUNCE_US);
}
static void button_dbg20v_deferred(void)
@@ -437,7 +444,6 @@ static void button_dbg20v_deferred(void)
else
enable_dbg20v_poll();
}
DECLARE_DEFERRED(button_dbg20v_deferred);
void vbus_event(enum gpio_signal signal)
{
@@ -729,10 +735,11 @@ static void board_init(void)
/* Initialize USB hub */
if (system_get_reset_flags() & RESET_FLAG_POWER_ON)
hook_call_deferred(board_usb_hub_reset_no_return, 500 * MSEC);
hook_call_deferred(&board_usb_hub_reset_no_return_data,
500 * MSEC);
/* Start detecting CC cable type */
hook_call_deferred(detect_cc_cable, SECOND);
hook_call_deferred(&detect_cc_cable_data, SECOND);
}
DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT);
@@ -752,11 +759,11 @@ static int cmd_fake_disconnect(int argc, char *argv[])
return EC_ERROR_PARAM2;
/* Cancel any pending function calls */
hook_call_deferred(fake_disconnect_start, -1);
hook_call_deferred(fake_disconnect_end, -1);
hook_call_deferred(&fake_disconnect_start_data, -1);
hook_call_deferred(&fake_disconnect_end_data, -1);
fake_pd_disconnect_duration_us = duration_ms * MSEC;
hook_call_deferred(fake_disconnect_start, delay_ms * MSEC);
hook_call_deferred(&fake_disconnect_start_data, delay_ms * MSEC);
ccprintf("Fake disconnect for %d ms starting in %d ms.\n",
duration_ms, delay_ms);
@@ -779,7 +786,7 @@ static int cmd_trigger_dfu(int argc, char *argv[])
ccprintf("Asserting CASE_CLOSE_DFU_L.\n");
ccprintf("If you expect to see DFU debug but it doesn't show up,\n");
ccprintf("try flipping the USB type-C cable.\n");
hook_call_deferred(trigger_dfu_release, 1500 * MSEC);
hook_call_deferred(&trigger_dfu_release_data, 1500 * MSEC);
return EC_SUCCESS;
}
DECLARE_CONSOLE_COMMAND(dfu, cmd_trigger_dfu, NULL, NULL, NULL);

View File

@@ -331,7 +331,7 @@ static int svdm_dp_attention(int port, uint32_t *payload)
if (irq & cur_lvl) {
gpio_set_level(GPIO_USBC_DP_HPD, 0);
hook_call_deferred(hpd_irq_deferred,
hook_call_deferred(&hpd_irq_deferred_data,
HPD_DSTREAM_DEBOUNCE_IRQ);
} else if (irq & !cur_lvl) {
CPRINTF("ERR:HPD:IRQ&LOW\n");

View File

@@ -177,7 +177,7 @@ DECLARE_DEFERRED(allow_min_charging);
static void extpower_board_hacks(int extpower, int extpower_prev)
{
/* Cancel deferred attempt to enable max charge request */
hook_call_deferred(allow_max_request, -1);
hook_call_deferred(&allow_max_request_data, -1);
/*
* When AC is detected, delay briefly before allowing PD
@@ -197,7 +197,7 @@ static void extpower_board_hacks(int extpower, int extpower_prev)
if (extpower && !extpower_prev) {
/* AC connected */
charger_disable(0);
hook_call_deferred(allow_max_request, 500*MSEC);
hook_call_deferred(&allow_max_request_data, 500*MSEC);
set_pp5000_in_g3(PP5000_IN_G3_AC, 1);
} else if (extpower && extpower_prev) {
/*
@@ -213,7 +213,7 @@ static void extpower_board_hacks(int extpower, int extpower_prev)
charger_disable(1);
hook_call_deferred(allow_min_charging, 100*MSEC);
hook_call_deferred(&allow_min_charging_data, 100*MSEC);
set_pp5000_in_g3(PP5000_IN_G3_AC, 0);
}
extpower_prev = extpower;

View File

@@ -163,7 +163,7 @@ void backlight_interrupt(enum gpio_signal signal)
* PCH indicates it is turning on backlight so we should
* attempt to put the backlight controller into PWM mode.
*/
hook_call_deferred(lp8555_enable_pwm_mode, 0);
hook_call_deferred(&lp8555_enable_pwm_mode_data, 0);
}
/**
@@ -177,7 +177,7 @@ static void update_backlight(void)
*/
gpio_set_level(GPIO_ENABLE_BACKLIGHT, lid_is_open());
if (lid_is_open())
hook_call_deferred(lp8555_enable_pwm_mode, 0);
hook_call_deferred(&lp8555_enable_pwm_mode_data, 0);
}
DECLARE_HOOK(HOOK_LID_CHANGE, update_backlight, HOOK_PRIO_DEFAULT);

View File

@@ -178,7 +178,7 @@ DECLARE_DEFERRED(pch_evt_deferred);
void pch_evt(enum gpio_signal signal)
{
hook_call_deferred(pch_evt_deferred, 0);
hook_call_deferred(&pch_evt_deferred_data, 0);
}
void board_config_pre_init(void)

View File

@@ -319,8 +319,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -301,7 +301,7 @@ static int svdm_dp_attention(int port, uint32_t *payload)
if (irq & cur_lvl) {
gpio_set_level(hpd, 0);
hook_call_deferred(hpd0_irq_deferred,
hook_call_deferred(&hpd0_irq_deferred_data,
HPD_DSTREAM_DEBOUNCE_IRQ);
} else if (irq & !cur_lvl) {
CPRINTF("ERR:HPD:IRQ&LOW\n");

View File

@@ -119,7 +119,7 @@ static void vbus_vol_read_deferred(void)
vbus_vol_tail = (flag_started == 0) ? 1 : vbus_vol_tail + 1;
}
hook_call_deferred(vbus_vol_read_deferred, DEFERRED_READ_TIME_US);
hook_call_deferred(&vbus_vol_read_deferred_data, DEFERRED_READ_TIME_US);
}
DECLARE_DEFERRED(vbus_vol_read_deferred);
@@ -149,7 +149,8 @@ static void vbus_curr_read_deferred(void)
vbus_curr_tail = (flag_started == 0) ? 1 : vbus_curr_tail + 1;
}
hook_call_deferred(vbus_curr_read_deferred, DEFERRED_READ_TIME_US);
hook_call_deferred(&vbus_curr_read_deferred_data,
DEFERRED_READ_TIME_US);
}
DECLARE_DEFERRED(vbus_curr_read_deferred);
#endif
@@ -364,8 +365,8 @@ void sniffer_init(void)
/* whether the sniffer task have started sending packet */
flag_started = 0;
hook_call_deferred(vbus_vol_read_deferred, 0);
hook_call_deferred(vbus_curr_read_deferred, 0);
hook_call_deferred(&vbus_vol_read_deferred_data, 0);
hook_call_deferred(&vbus_curr_read_deferred_data, 0);
#endif
/* remap TIM1 CH1/2/3 to DMA channel 6 */

View File

@@ -88,10 +88,11 @@ void usb1_evt(enum gpio_signal signal)
* state of GPIOs, so its definition must reside after including gpio_list.
*/
static void enable_input_devices(void);
DECLARE_DEFERRED(enable_input_devices);
void tablet_mode_interrupt(enum gpio_signal signal)
{
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
#include "gpio_list.h"
@@ -328,14 +329,13 @@ static void enable_input_devices(void)
keyboard_scan_enable(kb_enable, KB_SCAN_DISABLE_LID_ANGLE);
gpio_set_level(GPIO_ENABLE_TOUCHPAD, tp_enable);
}
DECLARE_DEFERRED(enable_input_devices);
/* Called on AP S5 -> S3 transition */
static void board_chipset_startup(void)
{
gpio_set_level(GPIO_USB1_ENABLE, 1);
gpio_set_level(GPIO_USB2_ENABLE, 1);
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_STARTUP, board_chipset_startup, HOOK_PRIO_DEFAULT);
@@ -344,7 +344,7 @@ static void board_chipset_shutdown(void)
{
gpio_set_level(GPIO_USB1_ENABLE, 0);
gpio_set_level(GPIO_USB2_ENABLE, 0);
hook_call_deferred(enable_input_devices, 0);
hook_call_deferred(&enable_input_devices_data, 0);
}
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, board_chipset_shutdown, HOOK_PRIO_DEFAULT);

View File

@@ -299,8 +299,9 @@ static void hpd1_irq_deferred(void)
DECLARE_DEFERRED(hpd0_irq_deferred);
DECLARE_DEFERRED(hpd1_irq_deferred);
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? hpd1_irq_deferred : \
hpd0_irq_deferred)
#define PORT_TO_HPD_IRQ_DEFERRED(port) ((port) ? \
&hpd1_irq_deferred_data : \
&hpd0_irq_deferred_data)
static int svdm_dp_attention(int port, uint32_t *payload)
{

View File

@@ -31,8 +31,8 @@ struct usb_stream_config {
/*
* Deferred function to call to handle USB and Queue request.
*/
void (*deferred_tx)(void);
void (*deferred_rx)(void);
const struct deferred_data *deferred_tx;
const struct deferred_data *deferred_rx;
int tx_size;
int rx_size;
@@ -109,14 +109,16 @@ extern struct producer_ops const usb_stream_producer_ops;
static uint8_t CONCAT2(NAME, _buf_tx_)[TX_SIZE]; \
static int CONCAT2(NAME, _is_reset_); \
static void CONCAT2(NAME, _deferred_tx_)(void); \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_tx_)); \
static void CONCAT2(NAME, _deferred_rx_)(void); \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_rx_)); \
struct usb_stream_config const NAME = { \
.endpoint = ENDPOINT, \
.is_reset = &CONCAT2(NAME, _is_reset_), \
.in_desc = &CONCAT2(NAME, _in_desc_), \
.out_desc = &CONCAT2(NAME, _out_desc_), \
.deferred_tx = CONCAT2(NAME, _deferred_tx_), \
.deferred_rx = CONCAT2(NAME, _deferred_rx_), \
.deferred_tx = &CONCAT2(NAME, _deferred_tx__data), \
.deferred_rx = &CONCAT2(NAME, _deferred_rx__data), \
.tx_size = TX_SIZE, \
.rx_size = RX_SIZE, \
.tx_ram = CONCAT2(NAME, _buf_tx_), \
@@ -162,10 +164,8 @@ extern struct producer_ops const usb_stream_producer_ops;
}; \
static void CONCAT2(NAME, _deferred_tx_)(void) \
{ tx_stream_handler(&NAME); } \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_tx_)); \
static void CONCAT2(NAME, _deferred_rx_)(void) \
{ rx_stream_handler(&NAME); } \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_rx_)); \
static void CONCAT2(NAME, _ep_tx)(void) \
{ \
usb_stream_tx(&NAME); \

View File

@@ -156,7 +156,7 @@ DECLARE_DEFERRED(rx_fifo_handler);
static void con_ep_rx(void)
{
/* Wake up the Rx FIFO handler */
hook_call_deferred(rx_fifo_handler, 0);
hook_call_deferred(&rx_fifo_handler_data, 0);
/* clear the RX/OUT interrupts */
GR_USB_DOEPINT(USB_EP_CONSOLE) = 0xffffffff;
@@ -189,14 +189,14 @@ DECLARE_DEFERRED(tx_fifo_handler);
static void handle_output(void)
{
/* Wake up the Tx FIFO handler */
hook_call_deferred(tx_fifo_handler, 0);
hook_call_deferred(&tx_fifo_handler_data, 0);
}
/* Tx/IN interrupt handler */
static void con_ep_tx(void)
{
/* Wake up the Tx FIFO handler */
hook_call_deferred(tx_fifo_handler, 0);
hook_call_deferred(&tx_fifo_handler_data, 0);
/* clear the Tx/IN interrupts */
GR_USB_DIEPINT(USB_EP_CONSOLE) = 0xffffffff;
@@ -223,8 +223,8 @@ static void ep_reset(void)
is_reset = 1;
/* Flush any queued data */
hook_call_deferred(tx_fifo_handler, 0);
hook_call_deferred(rx_fifo_handler, 0);
hook_call_deferred(&tx_fifo_handler_data, 0);
hook_call_deferred(&rx_fifo_handler_data, 0);
}

View File

@@ -657,7 +657,7 @@ void lpc_interrupt(void)
#ifdef CONFIG_CHIPSET_RESET_HOOK
/* Notify HOOK_CHIPSET_RESET */
hook_call_deferred(lpc_chipset_reset, MSEC);
hook_call_deferred(&lpc_chipset_reset_data, MSEC);
#endif
}

View File

@@ -80,18 +80,20 @@ void clock_init(void)
* Speed through boot + vboot hash calculation, dropping our processor clock
* only after vboot hashing is completed.
*/
static void clock_turbo_disable(void);
DECLARE_DEFERRED(clock_turbo_disable);
static void clock_turbo_disable(void)
{
#ifdef CONFIG_VBOOT_HASH
if (vboot_hash_in_progress())
hook_call_deferred(clock_turbo_disable, 100 * MSEC);
hook_call_deferred(&clock_turbo_disable_data, 100 * MSEC);
else
#endif
/* Use 12 MHz processor clock for power savings */
MEC1322_PCR_PROC_CLK_CTL = 4;
}
DECLARE_HOOK(HOOK_INIT, clock_turbo_disable, HOOK_PRIO_INIT_VBOOT_HASH + 1);
DECLARE_DEFERRED(clock_turbo_disable);
#ifdef CONFIG_LOW_POWER_IDLE
/**

View File

@@ -357,7 +357,7 @@ void girq19_interrupt(void)
#ifdef CONFIG_CHIPSET_RESET_HOOK
/* Notify HOOK_CHIPSET_RESET */
hook_call_deferred(lpc_chipset_reset, MSEC);
hook_call_deferred(&lpc_chipset_reset_data, MSEC);
#endif
}

View File

@@ -774,7 +774,7 @@ void lpc_lreset_pltrst_handler(void)
#ifdef CONFIG_CHIPSET_RESET_HOOK
if (lpc_get_pltrst_asserted()) {
/* Notify HOOK_CHIPSET_RESET */
hook_call_deferred(lpc_chipset_reset, MSEC);
hook_call_deferred(&lpc_chipset_reset_data, MSEC);
}
#endif
}

View File

@@ -57,7 +57,7 @@ struct usb_stream_config {
/*
* Deferred function to call to handle USB and Queue request.
*/
void (*deferred)(void);
const struct deferred_data *deferred;
size_t rx_size;
size_t tx_size;
@@ -130,10 +130,11 @@ extern struct producer_ops const usb_stream_producer_ops;
static usb_uint CONCAT2(NAME, _ep_tx_buffer)[TX_SIZE / 2] __usb_ram; \
static struct usb_stream_state CONCAT2(NAME, _state); \
static void CONCAT2(NAME, _deferred_)(void); \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_)); \
struct usb_stream_config const NAME = { \
.state = &CONCAT2(NAME, _state), \
.endpoint = ENDPOINT, \
.deferred = CONCAT2(NAME, _deferred_), \
.deferred = &CONCAT2(NAME, _deferred__data), \
.rx_size = RX_SIZE, \
.tx_size = TX_SIZE, \
.rx_ram = CONCAT2(NAME, _ep_rx_buffer), \
@@ -194,8 +195,7 @@ extern struct producer_ops const usb_stream_producer_ops;
CONCAT2(NAME, _ep_rx), \
CONCAT2(NAME, _ep_reset)); \
static void CONCAT2(NAME, _deferred_)(void) \
{ usb_stream_deferred(&NAME); } \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_));
{ usb_stream_deferred(&NAME); }
/*
* Handle USB and Queue request in a deferred callback.

View File

@@ -82,7 +82,7 @@ struct usb_i2c_config {
/*
* Deferred function to call to handle I2C request.
*/
void (*deferred)(void);
const struct deferred_data *deferred;
/*
* Pointers to USB packet RAM and bounce buffer.
@@ -114,10 +114,11 @@ struct usb_i2c_config {
static usb_uint CONCAT2(NAME, _ep_tx_buffer_) \
[USB_MAX_PACKET_SIZE / 2] __usb_ram; \
static void CONCAT2(NAME, _deferred_)(void); \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_)); \
struct usb_i2c_config const NAME = { \
.interface = INTERFACE, \
.endpoint = ENDPOINT, \
.deferred = CONCAT2(NAME, _deferred_), \
.deferred = &CONCAT2(NAME, _deferred__data), \
.buffer = CONCAT2(NAME, _buffer_), \
.rx_ram = CONCAT2(NAME, _ep_rx_buffer_), \
.tx_ram = CONCAT2(NAME, _ep_tx_buffer_), \
@@ -163,8 +164,7 @@ struct usb_i2c_config {
CONCAT2(NAME, _ep_rx_), \
CONCAT2(NAME, _ep_reset_)); \
static void CONCAT2(NAME, _deferred_)(void) \
{ usb_i2c_deferred(&NAME); } \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_));
{ usb_i2c_deferred(&NAME); }
/*
* Handle I2C request in a deferred callback.

View File

@@ -111,7 +111,7 @@ struct usb_spi_config {
/*
* Deferred function to call to handle SPI request.
*/
void (*deferred)(void);
const struct deferred_data *deferred;
/*
* Pointers to USB packet RAM and bounce buffer.
@@ -140,6 +140,7 @@ struct usb_spi_config {
static usb_uint CONCAT2(NAME, _ep_rx_buffer_)[USB_MAX_PACKET_SIZE / 2] __usb_ram; \
static usb_uint CONCAT2(NAME, _ep_tx_buffer_)[USB_MAX_PACKET_SIZE / 2] __usb_ram; \
static void CONCAT2(NAME, _deferred_)(void); \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_)); \
struct usb_spi_state CONCAT2(NAME, _state_) = { \
.enabled_host = 0, \
.enabled_device = 0, \
@@ -149,7 +150,7 @@ struct usb_spi_config {
.state = &CONCAT2(NAME, _state_), \
.interface = INTERFACE, \
.endpoint = ENDPOINT, \
.deferred = CONCAT2(NAME, _deferred_), \
.deferred = &CONCAT2(NAME, _deferred__data), \
.buffer = CONCAT2(NAME, _buffer_), \
.rx_ram = CONCAT2(NAME, _ep_rx_buffer_), \
.tx_ram = CONCAT2(NAME, _ep_tx_buffer_), \
@@ -197,8 +198,7 @@ struct usb_spi_config {
USB_DECLARE_IFACE(INTERFACE, \
CONCAT2(NAME, _interface_)); \
static void CONCAT2(NAME, _deferred_)(void) \
{ usb_spi_deferred(&NAME); } \
DECLARE_DEFERRED(CONCAT2(NAME, _deferred_));
{ usb_spi_deferred(&NAME); }
/*
* Handle SPI request in a deferred callback.

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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 */

View File

@@ -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)

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -27,7 +27,7 @@ int battery_command_cut_off(struct host_cmd_handler_args *args)
* transaction and release the I2C bus before we'll be abl eto send the
* cutoff command.
*/
hook_call_deferred(cutoff, 1000);
hook_call_deferred(&cutoff_data, 1000);
return EC_RES_SUCCESS;
}

View File

@@ -190,22 +190,26 @@ struct hook_data {
*/
void hook_notify(enum hook_type type);
struct deferred_data {
/* Deferred function pointer */
void (*routine)(void);
};
/**
* Start a timer to call a deferred routine.
*
* The routine will be called after at least the specified delay, in the
* context of the hook task.
*
* @param routine Routine to call; must have been declared with
* DECLARE_DEFERRED().
* @param us Delay in microseconds until routine will be called.
* If the routine is already pending, subsequent calls
* will change the delay. Pass us=0 to call as soon as
* possible, or -1 to cancel the deferred call.
* @param data The deferred_data struct created by invoking DECLARE_DEFERRED().
* @param us Delay in microseconds until routine will be called. If the
* routine is already pending, subsequent calls will change the
* delay. Pass us=0 to call as soon as possible, or -1 to cancel
* the deferred call.
*
* @return non-zero if error.
*/
int hook_call_deferred(void (*routine)(void), int us);
int hook_call_deferred(const struct deferred_data *data, int us);
#ifdef CONFIG_COMMON_RUNTIME
/**
@@ -239,18 +243,20 @@ int hook_call_deferred(void (*routine)(void), int us);
__attribute__((section(".rodata." STRINGIFY(hooktype)))) \
= {routine, priority}
struct deferred_data {
/* Deferred function pointer */
void (*routine)(void);
};
/**
* Register a deferred function call.
*
* Note that if you declare a bunch of these, you may need to override
* DEFERRABLE_MAX_COUNT in your board.h.
*
* DECLARE_DEFERRED creates a new deferred_data struct with a name constructed
* by concatenating _data to the name of the routine passed.
*
* To call a deferred routine defined as:
* DECLARE_DEFERRED(foo)
* You would call
* hook_call_deferred(&foo_data, delay_in_microseconds);
*
* NOTE: Deferred function call routines must be careful not to leave resources
* locked which may be needed by other hook routines or deferred function
* calls. This can cause a deadlock, because most hooks and all deferred
@@ -260,7 +266,7 @@ struct deferred_data {
* @param routine Function pointer, with prototype void routine(void)
*/
#define DECLARE_DEFERRED(routine) \
const struct deferred_data __keep CONCAT2(__deferred_, routine) \
const struct deferred_data __keep CONCAT2(routine, _data) \
__attribute__((section(".rodata.deferred"))) \
= {routine}

View File

@@ -1238,7 +1238,7 @@ void pd_send_hpd(int port, enum hpd_event hpd);
/**
* Enable USB Billboard Device.
*/
void pd_usb_billboard_deferred(void);
extern const struct deferred_data pd_usb_billboard_deferred_data;
/* --- Physical layer functions : chip specific --- */
/* Packet preparation/retrieval */

View File

@@ -473,7 +473,7 @@ static void siglog_add(enum gpio_signal signal)
siglog[siglog_entries].level = gpio_get_level(signal);
siglog_entries++;
hook_call_deferred(siglog_deferred, SECOND);
hook_call_deferred(&siglog_deferred_data, SECOND);
}
#define SIGLOG(S) siglog_add(S)

View File

@@ -281,7 +281,7 @@ void power_signal_interrupt(enum gpio_signal signal)
{
if (signal == GPIO_SUSPEND_L) {
/* Handle suspend events in the hook task */
hook_call_deferred(gaia_suspend_deferred, 0);
hook_call_deferred(&gaia_suspend_deferred_data, 0);
} else {
/* All other events are handled in the chipset task */
task_wake(TASK_ID_CHIPSET);

View File

@@ -613,7 +613,8 @@ static void power_on(void)
/* Push the power button */
set_pmic_pwron(1);
hook_call_deferred(release_pmic_pwron_deferred, PMIC_PWRON_PRESS_TIME);
hook_call_deferred(&release_pmic_pwron_deferred_data,
PMIC_PWRON_PRESS_TIME);
/* enable interrupt */
gpio_set_flags(GPIO_SUSPEND_L, INT_BOTH_PULL_UP);
@@ -645,7 +646,7 @@ void chipset_reset(int is_cold)
usleep(PMIC_COLD_RESET_L_HOLD_TIME);
/* Press the PMIC power button */
set_pmic_pwron(1);
hook_call_deferred(release_pmic_pwron_deferred,
hook_call_deferred(&release_pmic_pwron_deferred_data,
PMIC_PWRON_PRESS_TIME);
} else {
CPRINTS("EC triggered warm reboot");

View File

@@ -465,7 +465,7 @@ void power_signal_interrupt_S0(enum gpio_signal signal)
{
if (gpio_get_level(GPIO_PCH_SLP_S0_L)) {
slp_s0_debounce.required = 1;
hook_call_deferred(slp_s0_assertion_deferred, 3 * MSEC);
hook_call_deferred(&slp_s0_assertion_deferred_data, 3 * MSEC);
}
else if (slp_s0_debounce.required == 0) {
slp_s0_debounce.done = 0;

View File

@@ -62,6 +62,10 @@ static void non_deferred_func(void)
deferred_call_count++;
}
static const struct deferred_data non_deferred_func_data = {
non_deferred_func
};
static int test_init_hook(void)
{
TEST_ASSERT(init_hook_count == 1);
@@ -104,25 +108,25 @@ static int test_priority(void)
static int test_deferred(void)
{
deferred_call_count = 0;
hook_call_deferred(deferred_func, 50 * MSEC);
hook_call_deferred(&deferred_func_data, 50 * MSEC);
usleep(100 * MSEC);
TEST_ASSERT(deferred_call_count == 1);
hook_call_deferred(deferred_func, 50 * MSEC);
hook_call_deferred(&deferred_func_data, 50 * MSEC);
usleep(25 * MSEC);
hook_call_deferred(deferred_func, -1);
hook_call_deferred(&deferred_func_data, -1);
usleep(75 * MSEC);
TEST_ASSERT(deferred_call_count == 1);
hook_call_deferred(deferred_func, 50 * MSEC);
hook_call_deferred(&deferred_func_data, 50 * MSEC);
usleep(25 * MSEC);
hook_call_deferred(deferred_func, -1);
hook_call_deferred(&deferred_func_data, -1);
usleep(15 * MSEC);
hook_call_deferred(deferred_func, 25 * MSEC);
hook_call_deferred(&deferred_func_data, 25 * MSEC);
usleep(50 * MSEC);
TEST_ASSERT(deferred_call_count == 2);
TEST_ASSERT(hook_call_deferred(non_deferred_func, 50 * MSEC) !=
TEST_ASSERT(hook_call_deferred(&non_deferred_func_data, 50 * MSEC) !=
EC_SUCCESS);
usleep(100 * MSEC);
TEST_ASSERT(deferred_call_count == 2);