Allow resetting of acpu_freq_tbl voltage minimum via vdd_levels sysfs interface
/drivers/cpufreq/cpufreq.c
blob:bbde88eedb91db2c78b5d23a1ea63466dea28611 -> blob:72e7bbc937bd8ec48f2b19db031db152ecbf631a
--- drivers/cpufreq/cpufreq.c
+++ drivers/cpufreq/cpufreq.c
@@ -672,21 +672,28 @@ static ssize_t show_vdd_levels(struct ko
}
extern void acpuclk_set_vdd(unsigned acpu_khz, int vdd);
+extern void acpuclk_set_vmin(int newvmin);
static ssize_t store_vdd_levels(struct kobject *a, struct attribute *b, const char *buf, size_t count)
{
int i = 0, j;
int pair[2] = { 0, 0 };
int sign = 0;
+ int vmin = 0;
+
if (count < 1)
return 0;
+
if (buf[0] == '-') {
sign = -1;
i++;
- }
- else if (buf[0] == '+') {
+ } else if (buf[0] == '+') {
sign = 1;
i++;
+ } else if (buf[0] == 'v' && buf[1] == 'm' && buf[2] == 'i' && buf[3] == 'n') {
+ vmin = 1;
+ i+=4;
}
+
for (j = 0; i < count; i++) {
char c = buf[i];
if ((c >= '0') && (c <= '9')) {
@@ -703,16 +710,20 @@ static ssize_t store_vdd_levels(struct k
else
break;
}
+
if (sign != 0) {
if (pair[0] > 0)
acpuclk_set_vdd(0, sign * pair[0]);
- }
- else {
+ } else if (vmin == 1) {
+ if (pair[0] > 0)
+ acpuclk_set_vmin(pair[0]);
+ } else {
if ((pair[0] > 0) && (pair[1] > 0))
acpuclk_set_vdd((unsigned)pair[0], pair[1]);
else
return -EINVAL;
}
+
return count;
}
#endif /* CONFIG_VDD_USERSPACE */