diff options
author | Karthik Parsha <kparsha@codeaurora.org> | 2011-02-25 17:01:04 -0800 |
---|---|---|
committer | Keyan Mobli <persiansown@gmail.com> | 2011-09-25 01:11:14 -0500 |
commit | 9b7adac0daa7024f3fcc8491caefd82ecd75f9ba (patch) | |
tree | ed9637759bca659ad69f4e94c6bfddbf0ea143cb | |
parent | 0c213b1c3392a93d83e6ea29e63aed9ce96557a3 (diff) | |
download | android_hardware_libhardware_legacy-gingerbread-release.tar.gz android_hardware_libhardware_legacy-gingerbread-release.tar.bz2 android_hardware_libhardware_legacy-gingerbread-release.zip |
power: Add support for CPU_MAX_WAKE_LOCK.cm-7.1.0gingerbread-release
Change-Id: I93f15087a35ed9bbfcedf4c182ee80ebac4caae3
-rw-r--r-- | include/hardware_legacy/power.h | 4 | ||||
-rw-r--r-- | power/power.c | 83 |
2 files changed, 87 insertions, 0 deletions
diff --git a/include/hardware_legacy/power.h b/include/hardware_legacy/power.h index b7cee43..8b29f22 100644 --- a/include/hardware_legacy/power.h +++ b/include/hardware_legacy/power.h @@ -33,6 +33,10 @@ enum { int acquire_wake_lock(int lock, const char* id); int release_wake_lock(const char* id); +//while you have a cpu lock held, the cpu freq will be held at max cpu freq +int acquire_cpu_max_lock(); +int release_cpu_max_lock(); + // true if you want the screen on, false if you want it off int set_screen_state(int on); diff --git a/power/power.c b/power/power.c index 1dac44b..bca52fc 100644 --- a/power/power.c +++ b/power/power.c @@ -42,6 +42,17 @@ enum { OUR_FD_COUNT }; +enum { + CPU_SCALING_MAX_FREQ = 0, + CPU_SCALING_MIN_FREQ, + CPU_FD_COUNT +}; + +const char * const CPU_PATHS[] = { + "/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", + "/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq" +}; + const char * const OLD_PATHS[] = { "/sys/android_power/acquire_partial_wake_lock", "/sys/android_power/release_wake_lock", @@ -61,6 +72,14 @@ static int g_initialized = 0; static int g_fds[OUR_FD_COUNT]; static int g_error = 1; +static int cpu_fds_initialized = 0; +static int cpu_min_max_initialized = 0; +static int cpu_fds[CPU_FD_COUNT]; +static int cpu_fds_error = 0; +#define CPU_FREQ_MAX_SIZE 20 +static char cpu_scaling_max_freq_default[CPU_FREQ_MAX_SIZE]; +static char cpu_scaling_min_freq_default[CPU_FREQ_MAX_SIZE]; + static const char *off_state = "mem"; static const char *on_state = "on"; @@ -106,6 +125,8 @@ initialize_fds(void) } } + + int acquire_wake_lock(int lock, const char* id) { @@ -140,6 +161,68 @@ release_wake_lock(const char* id) return len >= 0; } +static int +open_cpu_file_descriptors() +{ + int i; + for (i=0; i<CPU_FD_COUNT; i++) { + int fd = open(CPU_PATHS[i], O_RDWR); + if (fd < 0) { + LOGE("fatal error opening \"%s\"\n", CPU_PATHS[i]); + cpu_fds_error = errno; + return -1; + } + cpu_fds[i] = fd; + } + + cpu_fds_error = 0; + return 0; +} + +static inline void +initialize_cpu_fds(void) +{ + if (cpu_fds_initialized == 0) + if (open_cpu_file_descriptors() == 0) + cpu_fds_initialized = 1; +} + +static inline void +initialize_cpu_min_max(void) +{ + if(cpu_min_max_initialized == 0) { + read(cpu_fds[CPU_SCALING_MAX_FREQ], + cpu_scaling_max_freq_default, CPU_FREQ_MAX_SIZE); + read(cpu_fds[CPU_SCALING_MIN_FREQ], + cpu_scaling_min_freq_default, CPU_FREQ_MAX_SIZE); + cpu_min_max_initialized = 1; + } +} + +int +acquire_cpu_max_lock() +{ + initialize_cpu_fds(); + if (cpu_fds_error) return cpu_fds_error; + initialize_cpu_min_max(); + + return write(cpu_fds[CPU_SCALING_MIN_FREQ], + cpu_scaling_max_freq_default, CPU_FREQ_MAX_SIZE); +} + +int +release_cpu_max_lock() +{ + initialize_cpu_fds(); + if (cpu_fds_error) return cpu_fds_error; + + if(cpu_min_max_initialized == 0) return 0; + + return write(cpu_fds[CPU_SCALING_MIN_FREQ], + cpu_scaling_min_freq_default, CPU_FREQ_MAX_SIZE); +} + + int set_last_user_activity_timeout(int64_t delay) { |