msm: Add sysfs interface for mfreq
Add mfreq interface in sysfs. This forces the system to use the
maximum CPU clock on all CPU cores.
(mfreq=1 enables, mfreq=0 disables)
Signed-off-by: David Ng <dave@codeaurora.org>
Conflicts:
arch/arm/mach-msm/cpufreq.c
diff --git a/arch/arm/mach-msm/cpufreq.c b/arch/arm/mach-msm/cpufreq.c
index c01332a..99dfe11 100644
--- a/arch/arm/mach-msm/cpufreq.c
+++ b/arch/arm/mach-msm/cpufreq.c
@@ -49,13 +49,21 @@
static DEFINE_PER_CPU(struct cpufreq_suspend_t, cpufreq_suspend);
+static int override_cpu;
+
static int set_cpu_freq(struct cpufreq_policy *policy, unsigned int new_freq)
{
int ret = 0;
struct cpufreq_freqs freqs;
freqs.old = policy->cur;
- freqs.new = new_freq;
+ if (override_cpu) {
+ if (policy->cur == policy->max)
+ return 0;
+ else
+ freqs.new = policy->max;
+ } else
+ freqs.new = new_freq;
freqs.cpu = policy->cpu;
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
ret = acpuclk_set_rate(policy->cpu, new_freq, SETRATE_CPUFREQ);
@@ -247,6 +255,25 @@
}
}
+static ssize_t store_mfreq(struct sysdev_class *class,
+ struct sysdev_class_attribute *attr,
+ const char *buf, size_t count)
+{
+ u64 val;
+
+ if (strict_strtoull(buf, 0, &val) < 0) {
+ pr_err("Invalid parameter to mfreq\n");
+ return 0;
+ }
+ if (val)
+ override_cpu = 1;
+ else
+ override_cpu = 0;
+ return count;
+}
+
+static SYSDEV_CLASS_ATTR(mfreq, 0200, NULL, store_mfreq);
+
static struct cpufreq_driver msm_cpufreq_driver = {
/* lps calculations are handled here. */
.flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS,
@@ -264,6 +291,11 @@
{
int cpu;
+ int err = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
+ &attr_mfreq.attr);
+ if (err)
+ pr_err("Failed to create sysfs mfreq\n");
+
for_each_possible_cpu(cpu) {
mutex_init(&(per_cpu(cpufreq_suspend, cpu).suspend_mutex));
per_cpu(cpufreq_suspend, cpu).device_suspended = 0;