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;