diff options
author | Steve Kondik <shade@chemlab.org> | 2012-08-09 09:30:31 -0700 |
---|---|---|
committer | Justin White <just6979@gmail.com> | 2012-10-20 13:06:12 -0400 |
commit | d5018f60871c42d88e3295dbea0fa588cdc8c4fb (patch) | |
tree | 36810ab67ee3029f37224157d15b8d3222db6e79 | |
parent | 687efdd103118db16e26cd22e3a0c288fd416670 (diff) | |
download | device_samsung_crespo-d5018f60871c42d88e3295dbea0fa588cdc8c4fb.zip device_samsung_crespo-d5018f60871c42d88e3295dbea0fa588cdc8c4fb.tar.gz device_samsung_crespo-d5018f60871c42d88e3295dbea0fa588cdc8c4fb.tar.bz2 |
s5pc110: PowerHAL boostpusle flexibility
Squashed commits of the following ported cherry-picks from d2:
--------
Make PowerHAL more flexible
* Support boostpulse on both ondemand and interactive
* Reopen the boostpulse node if it becomes invalid due to a governor
change.
http://review.cyanogenmod.com/#/c/20919/
--------
Add support for CPU_BOOST hint
* The new CPU_BOOST hint takes a duration, add support for this.
* Also clean up governor detection and whitespace.
http://review.cyanogenmod.com/#/c/23788/
--------
Change-Id: I0711be15d87ef7a02076e26639ee5b22771cda6b
-rw-r--r-- | power/power.c | 99 |
1 files changed, 91 insertions, 8 deletions
diff --git a/power/power.c b/power/power.c index 78a9f1e..13f336d 100644 --- a/power/power.c +++ b/power/power.c @@ -27,7 +27,9 @@ #include <hardware/hardware.h> #include <hardware/power.h> -#define BOOSTPULSE_PATH "/sys/devices/system/cpu/cpufreq/ondemand/boostpulse" +#define SCALING_GOVERNOR_PATH "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor" +#define BOOSTPULSE_ONDEMAND "/sys/devices/system/cpu/cpufreq/ondemand/boostpulse" +#define BOOSTPULSE_INTERACTIVE "/sys/devices/system/cpu/cpufreq/interactive/boostpulse" struct s5pc110_power_module { struct power_module base; @@ -36,21 +38,97 @@ struct s5pc110_power_module { int boostpulse_warned; }; +static int sysfs_read(char *path, char *s, int num_bytes) +{ + char buf[80]; + int count; + int ret = 0; + int fd = open(path, O_RDONLY); + + if (fd < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error opening %s: %s\n", path, buf); + + return -1; + } + + if ((count = read(fd, s, num_bytes - 1)) < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error writing to %s: %s\n", path, buf); + + ret = -1; + } else { + s[count] = '\0'; + } + + close(fd); + + return ret; +} + +static void sysfs_write(char *path, char *s) +{ + char buf[80]; + int len; + int fd = open(path, O_WRONLY); + + if (fd < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error opening %s: %s\n", path, buf); + return; + } + + len = write(fd, s, strlen(s)); + if (len < 0) { + strerror_r(errno, buf, sizeof(buf)); + ALOGE("Error writing to %s: %s\n", path, buf); + } + + close(fd); +} + +static int get_scaling_governor(char governor[], int size) +{ + if (sysfs_read(SCALING_GOVERNOR_PATH, governor, + size) == -1) { + // Can't obtain the scaling governor. Return. + return -1; + } else { + // Strip newline at the end. + int len = strlen(governor); + + len--; + + while (len >= 0 && (governor[len] == '\n' || governor[len] == '\r')) + governor[len--] = '\0'; + } + + return 0; +} + static int boostpulse_open(struct s5pc110_power_module *s5pc110) { char buf[80]; + char governor[80]; pthread_mutex_lock(&s5pc110->lock); if (s5pc110->boostpulse_fd < 0) { - s5pc110->boostpulse_fd = open(BOOSTPULSE_PATH, O_WRONLY); - - if (s5pc110->boostpulse_fd < 0) { - if (!s5pc110->boostpulse_warned) { + if (get_scaling_governor(governor, sizeof(governor)) < 0) { + ALOGE("Can't read scaling governor."); + s5pc110->boostpulse_warned = 1; + } else { + if (strncmp(governor, "ondemand", 8) == 0) + s5pc110->boostpulse_fd = open(BOOSTPULSE_ONDEMAND, O_WRONLY); + else if (strncmp(governor, "interactive", 11) == 0) + s5pc110->boostpulse_fd = open(BOOSTPULSE_INTERACTIVE, O_WRONLY); + + if (s5pc110->boostpulse_fd < 0 && !s5pc110->boostpulse_warned) { strerror_r(errno, buf, sizeof(buf)); - ALOGE("Error opening %s: %s\n", BOOSTPULSE_PATH, buf); + ALOGE("Error opening boostpulse: %s\n", buf); s5pc110->boostpulse_warned = 1; - } + } else if (s5pc110->boostpulse_fd > 0) + ALOGD("Opened %s boostpulse interface", governor); } } @@ -78,7 +156,12 @@ static void s5pc110_power_hint(struct power_module *module, power_hint_t hint, if (len < 0) { strerror_r(errno, buf, sizeof(buf)); - ALOGE("Error writing to %s: %s\n", BOOSTPULSE_PATH, buf); + ALOGE("Error writing to boostpulse: %s\n", buf); + pthread_mutex_lock(&s5pc110->lock); + close(s5pc110->boostpulse_fd); + s5pc110->boostpulse_fd = -1; + s5pc110->boostpulse_warned = 0; + pthread_mutex_unlock(&s5pc110->lock); } } break; |