diff options
author | Jonas Aaberg <jonas.aberg@stericsson.com> | 2011-09-15 15:23:31 +0200 |
---|---|---|
committer | Robert Marklund <robert.marklund@stericsson.com> | 2011-10-05 12:59:59 +0200 |
commit | 526e0c9c57e251b911f68d0787d84e9736ff2c6f (patch) | |
tree | a865a9430e1fd100b180b509e2686374fcad2e1f | |
parent | 07191809f519de4e8e217c8e81e6b73b086246f1 (diff) |
drivers: cpufreq: dbx500: Add interface to get lowest frequency
Change-Id: If41bdc4356b066b20c682b683a90cfd7bfd16bb1
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32066
-rw-r--r-- | drivers/cpufreq/dbx500-cpufreq.c | 58 | ||||
-rw-r--r-- | include/linux/cpufreq-dbx500.h | 14 | ||||
-rw-r--r-- | include/linux/cpufreq.h | 1 |
3 files changed, 73 insertions, 0 deletions
diff --git a/drivers/cpufreq/dbx500-cpufreq.c b/drivers/cpufreq/dbx500-cpufreq.c index cb0bca33761..eb7c89e2855 100644 --- a/drivers/cpufreq/dbx500-cpufreq.c +++ b/drivers/cpufreq/dbx500-cpufreq.c @@ -135,6 +135,64 @@ static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu) return freq_table[i].frequency; } +int dbx500_cpufreq_get_limits(int cpu, int r, + unsigned int *min, unsigned int *max) +{ + int op; + int i; + int ret; + static int old_freq; + struct cpufreq_policy p; + + switch (r) { + case 0: + /* Fall through */ + case 25: + op = ARM_EXTCLK; + break; + case 50: + op = ARM_50_OPP; + break; + case 100: + op = ARM_100_OPP; + break; + case 125: + if (cpu_is_u8500() && prcmu_has_arm_maxopp()) + op = ARM_MAX_OPP; + else + op = ARM_100_OPP; + break; + default: + pr_err("cpufreq-dbx500: Incorrect arm target value (%d).\n", + r); + BUG(); + break; + } + + for (i = 0; idx2opp[i] != op; i++) + ; + + if (freq_table[i].frequency == CPUFREQ_TABLE_END) { + pr_err("cpufreq-dbx500: Minimum frequency does not exist!\n"); + BUG(); + } + + if (freq_table[i].frequency != old_freq) + pr_debug("cpufreq-dbx500: set min arm freq to %d\n", + freq_table[i].frequency); + + (*min) = freq_table[i].frequency; + + ret = cpufreq_get_policy(&p, cpu); + if (ret) { + pr_err("cpufreq-dbx500: Failed to get policy.\n"); + return -EINVAL; + } + + (*max) = p.max; + return 0; +} + static int __cpuinit dbx500_cpufreq_init(struct cpufreq_policy *policy) { int res; diff --git a/include/linux/cpufreq-dbx500.h b/include/linux/cpufreq-dbx500.h new file mode 100644 index 00000000000..80d67083e11 --- /dev/null +++ b/include/linux/cpufreq-dbx500.h @@ -0,0 +1,14 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + */ +#ifndef __CPUFREQ_DBX500_H +#define __CPUFREQ_DBX500_H + +#include <linux/cpufreq.h> + +int dbx500_cpufreq_get_limits(int cpu, int r, + unsigned int *min, unsigned int *max); + +#endif diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 91230897ad8..1d7f944ddd6 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -332,6 +332,7 @@ static inline unsigned int cpufreq_quick_get(unsigned int cpu) } #endif +int cpufreq_update_freq(int cpu, unsigned int min, unsigned int max); /********************************************************************* * CPUFREQ DEFAULT GOVERNOR * |