Implement HAVS with vdd_levels sysfs interface
/drivers/cpufreq/cpufreq.c
blob:82ca016d5bbf4a60775ada004f60df3ee7a23104 -> blob:505e35815ef8eae678ce909c6889911ae25ca45b
--- drivers/cpufreq/cpufreq.c
+++ drivers/cpufreq/cpufreq.c
@@ -650,16 +650,25 @@ static ssize_t show_scaling_setspeed(str
#ifdef CONFIG_CPU_FREQ_VDD_LEVELS
extern ssize_t acpuclk_get_vdd_levels_str(char *buf);
+#ifdef CONFIG_MSM_CPU_AVS
+static ssize_t show_vdd_levels_havs(struct cpufreq_policy *policy, char *buf)
+#else
static ssize_t show_vdd_levels(struct cpufreq_policy *policy, char *buf)
+#endif
{
return acpuclk_get_vdd_levels_str(buf);
}
-extern void acpuclk_set_vdd(unsigned acpu_khz, int vdd);
+#ifdef CONFIG_MSM_CPU_AVS
+extern void acpuclk_set_vdd(unsigned acpu_khz, int min_vdd, int max_vdd);
+static ssize_t store_vdd_levels_havs(struct cpufreq_policy *policy, const char *buf, size_t count)
+#else
+extern void acpuclk_set_vdd(unsigned acpu_khz, int max_vdd);
static ssize_t store_vdd_levels(struct cpufreq_policy *policy, const char *buf, size_t count)
+#endif
{
int i = 0, j;
- int pair[2] = { 0, 0 };
+ int pair[3] = { 0, 0, 0 };
int sign = 0;
if (count < 1)
@@ -689,7 +698,11 @@ static ssize_t store_vdd_levels(struct c
if (pair[j] != 0)
{
j++;
+#ifndef CONFIG_MSM_CPU_AVS
if ((sign != 0) || (j > 1))
+#else
+ if ((sign != 0) || (j > 2))
+#endif
break;
}
}
@@ -700,12 +713,21 @@ static ssize_t store_vdd_levels(struct c
if (sign != 0)
{
if (pair[0] > 0)
+#ifndef CONFIG_MSM_CPU_AVS
acpuclk_set_vdd(0, sign * pair[0]);
+#else
+ acpuclk_set_vdd(0, sign * pair[0], 0);
+#endif
}
else
{
+#ifndef CONFIG_MSM_CPU_AVS
if ((pair[0] > 0) && (pair[1] > 0))
acpuclk_set_vdd((unsigned)pair[0], pair[1]);
+#else
+ if ((pair[0] > 0) && (pair[1] > 0) && (pair[2] > 0))
+ acpuclk_set_vdd((unsigned)pair[0], pair[1], pair[2]);
+#endif
else
return -EINVAL;
}
@@ -741,8 +763,12 @@ define_one_rw(scaling_max_freq);
define_one_rw(scaling_governor);
define_one_rw(scaling_setspeed);
#ifdef CONFIG_CPU_FREQ_VDD_LEVELS
+#ifdef CONFIG_MSM_CPU_AVS
+define_one_rw(vdd_levels_havs);
+#else
define_one_rw(vdd_levels);
#endif
+#endif
static struct attribute *default_attrs[] = {
&cpuinfo_min_freq.attr,
@@ -757,8 +783,12 @@ static struct attribute *default_attrs[]
&scaling_available_governors.attr,
&scaling_setspeed.attr,
#ifdef CONFIG_CPU_FREQ_VDD_LEVELS
+#ifdef CONFIG_MSM_CPU_AVS
+ &vdd_levels_havs.attr,
+#else
&vdd_levels.attr,
#endif
+#endif
NULL
};