diff options
Diffstat (limited to 'power-8226.c')
-rw-r--r-- | power-8226.c | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/power-8226.c b/power-8226.c index b654923..7f5ff72 100644 --- a/power-8226.c +++ b/power-8226.c @@ -35,6 +35,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #define LOG_TAG "QTI PowerHAL" #include <hardware/hardware.h> @@ -123,6 +124,46 @@ static int process_video_decode_hint(void* metadata) { return HINT_NONE; } +// clang-format off +static int resources_interaction_boost[] = { + CPUS_ONLINE_MIN_2, + 0x20B, + 0x30B +}; +// clang-format on + +const int kDefaultInteractiveDuration = 500; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ + +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kDefaultInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + interaction(duration, ARRAY_SIZE(resources_interaction_boost), resources_interaction_boost); +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { @@ -133,10 +174,7 @@ int power_hint_override(power_hint_t hint, void* data) { ret_val = process_video_decode_hint(data); break; case POWER_HINT_INTERACTION: - int resources[] = {CPUS_ONLINE_MIN_2, 0x20B, 0x30B}; - int duration = 3000; - - interaction(duration, ARRAY_SIZE(resources), resources); + process_interaction_hint(data); ret_val = HINT_HANDLED; break; default: |