diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 81334ada8a61..815c5efb5c22 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -76,6 +76,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -490,6 +491,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_test_clear_look_around_ref); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dma_buf_stats_teardown); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_madvise_cold_or_pageout_abort); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_compact_finished); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wakeup_bypass); /* * For type visibility */ diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index f2d4e4daa818..725a196662af 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -28,6 +28,7 @@ #include #include #include +#include struct gpio_button_data { const struct gpio_keys_button *button; @@ -958,11 +959,16 @@ static int __maybe_unused gpio_keys_suspend(struct device *dev) struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - error = gpio_keys_enable_wakeup(ddata); - if (error) - return error; + if (!wakeup_bypass_enabled) { + error = gpio_keys_enable_wakeup(ddata); + if (error) + return error; + } } else { mutex_lock(&input->mutex); if (input->users) @@ -978,9 +984,13 @@ static int __maybe_unused gpio_keys_resume(struct device *dev) struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error = 0; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - gpio_keys_disable_wakeup(ddata); + if (!wakeup_bypass_enabled) + gpio_keys_disable_wakeup(ddata); } else { mutex_lock(&input->mutex); if (input->users) diff --git a/include/trace/hooks/wakeupbypass.h b/include/trace/hooks/wakeupbypass.h new file mode 100644 index 000000000000..a96c8874481e --- /dev/null +++ b/include/trace/hooks/wakeupbypass.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM wakeupbypass + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_WAKEUPBYPASS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_WAKEUPBYPASS_H +#include + +DECLARE_HOOK(android_vh_wakeup_bypass, + TP_PROTO(int *is_wakeup_bypassed), + TP_ARGS(is_wakeup_bypassed)); + +#endif /* _TRACE_HOOK_WAKEUPBYPASS_H */ +/* This part must be outside protection */ +#include diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 1de426d3f694..3a20a9f9f7b5 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -33,6 +33,8 @@ #define CREATE_TRACE_POINTS #include +#undef CREATE_TRACE_POINTS +#include /** * struct alarm_base - Alarm timer bases * @lock: Lock for syncrhonized access to the base @@ -246,6 +248,7 @@ static int alarmtimer_suspend(struct device *dev) struct rtc_device *rtc; unsigned long flags; struct rtc_time tm; + int wakeup_bypass_enabled = 0; spin_lock_irqsave(&freezer_delta_lock, flags); min = freezer_delta; @@ -254,6 +257,10 @@ static int alarmtimer_suspend(struct device *dev) freezer_delta = 0; spin_unlock_irqrestore(&freezer_delta_lock, flags); + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); + if (wakeup_bypass_enabled) + return 0; + rtc = alarmtimer_get_rtcdev(); /* If we have no rtcdev, just return */ if (!rtc)