summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Poynor <toddpoynor@google.com>2012-05-03 00:16:55 -0700
committerJohn Stultz <john.stultz@linaro.org>2012-08-10 16:23:21 -0400
commit24d5ba34cc0b26c04f0b1c7759fcad4edef9d1b6 (patch)
tree9e5a82ef3c32ace9638640441bba674418833a2d
parent7ebd5e3e5aaf86170ab41255928a2abb8de0abfa (diff)
downloadlinux-topics-24d5ba34cc0b26c04f0b1c7759fcad4edef9d1b6.tar.gz
cpufreq: interactive: add boost pulse interface
Change-Id: Icf1e86d2065cc8f0816ba9c6b065eb056d4e8249 Signed-off-by: Todd Poynor <toddpoynor@google.com>
-rw-r--r--Documentation/cpu-freq/governors.txt9
-rw-r--r--drivers/cpufreq/cpufreq_interactive.c32
-rw-r--r--include/trace/events/cpufreq_interactive.h20
3 files changed, 44 insertions, 17 deletions
diff --git a/Documentation/cpu-freq/governors.txt b/Documentation/cpu-freq/governors.txt
index 97a08d9e392..6aed1ce3673 100644
--- a/Documentation/cpu-freq/governors.txt
+++ b/Documentation/cpu-freq/governors.txt
@@ -241,8 +241,13 @@ not idle. Default is 20000 uS.
input_boost: If non-zero, boost speed of all CPUs to hispeed_freq on
touchscreen activity. Default is 0.
-boost: If non-zero, immediately boost speed of all CPUs to
-hispeed_freq. If zero, allow CPU speeds to drop below hispeed_freq.
+boost: If non-zero, immediately boost speed of all CPUs to at least
+hispeed_freq until zero is written to this attribute. If zero, allow
+CPU speeds to drop below hispeed_freq according to load as usual.
+
+boostpulse: Immediately boost speed of all CPUs to hispeed_freq for
+min_sample_time, after which speeds are allowed to drop below
+hispeed_freq according to load as usual.
3. The Governor Interface in the CPUfreq Core
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index e1310c449dc..62c6da13105 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -494,7 +494,6 @@ static void cpufreq_interactive_boost(void)
unsigned long flags;
struct cpufreq_interactive_cpuinfo *pcpu;
- trace_cpufreq_interactive_boost(hispeed_freq);
spin_lock_irqsave(&up_cpumask_lock, flags);
for_each_online_cpu(i) {
@@ -533,8 +532,10 @@ static void cpufreq_interactive_input_event(struct input_handle *handle,
unsigned int type,
unsigned int code, int value)
{
- if (input_boost_val && type == EV_SYN && code == SYN_REPORT)
+ if (input_boost_val && type == EV_SYN && code == SYN_REPORT) {
+ trace_cpufreq_interactive_boost("input");
cpufreq_interactive_boost();
+ }
}
static void cpufreq_interactive_input_open(struct work_struct *w)
@@ -762,16 +763,36 @@ static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
boost_val = val;
- if (boost_val)
+ if (boost_val) {
+ trace_cpufreq_interactive_boost("on");
cpufreq_interactive_boost();
- else
- trace_cpufreq_interactive_unboost(hispeed_freq);
+ } else {
+ trace_cpufreq_interactive_unboost("off");
+ }
return count;
}
define_one_global_rw(boost);
+static ssize_t store_boostpulse(struct kobject *kobj, struct attribute *attr,
+ const char *buf, size_t count)
+{
+ int ret;
+ unsigned long val;
+
+ ret = kstrtoul(buf, 0, &val);
+ if (ret < 0)
+ return ret;
+
+ trace_cpufreq_interactive_boost("pulse");
+ cpufreq_interactive_boost();
+ return count;
+}
+
+static struct global_attr boostpulse =
+ __ATTR(boostpulse, 0200, NULL, store_boostpulse);
+
static struct attribute *interactive_attributes[] = {
&hispeed_freq_attr.attr,
&go_hispeed_load_attr.attr,
@@ -780,6 +801,7 @@ static struct attribute *interactive_attributes[] = {
&timer_rate_attr.attr,
&input_boost.attr,
&boost.attr,
+ &boostpulse.attr,
NULL,
};
diff --git a/include/trace/events/cpufreq_interactive.h b/include/trace/events/cpufreq_interactive.h
index ae6f232e498..0791f2728c1 100644
--- a/include/trace/events/cpufreq_interactive.h
+++ b/include/trace/events/cpufreq_interactive.h
@@ -83,27 +83,27 @@ DEFINE_EVENT(loadeval, cpufreq_interactive_notyet,
);
TRACE_EVENT(cpufreq_interactive_boost,
- TP_PROTO(unsigned long freq),
- TP_ARGS(freq),
+ TP_PROTO(char *s),
+ TP_ARGS(s),
TP_STRUCT__entry(
- __field(unsigned long, freq)
+ __field(char *, s)
),
TP_fast_assign(
- __entry->freq = freq;
+ __entry->s = s;
),
- TP_printk("freq=%lu", __entry->freq)
+ TP_printk("%s", __entry->s)
);
TRACE_EVENT(cpufreq_interactive_unboost,
- TP_PROTO(unsigned long freq),
- TP_ARGS(freq),
+ TP_PROTO(char *s),
+ TP_ARGS(s),
TP_STRUCT__entry(
- __field(unsigned long, freq)
+ __field(char *, s)
),
TP_fast_assign(
- __entry->freq = freq;
+ __entry->s = s;
),
- TP_printk("freq=%lu", __entry->freq)
+ TP_printk("%s", __entry->s)
);
#endif /* _TRACE_CPUFREQ_INTERACTIVE_H */