diff options
-rw-r--r-- | arch/arm/mach-ux500/pm/Makefile | 4 | ||||
-rw-r--r-- | arch/arm/mach-ux500/pm/cpufreq-db8500.c | 53 | ||||
-rw-r--r-- | arch/arm/mach-ux500/pm/cpufreq.c | 44 | ||||
-rw-r--r-- | arch/arm/mach-ux500/pm/cpufreq.h | 12 |
4 files changed, 77 insertions, 36 deletions
diff --git a/arch/arm/mach-ux500/pm/Makefile b/arch/arm/mach-ux500/pm/Makefile index 7f5f5930a0e..3d8d64bbc26 100644 --- a/arch/arm/mach-ux500/pm/Makefile +++ b/arch/arm/mach-ux500/pm/Makefile @@ -9,3 +9,7 @@ obj-$(CONFIG_UX500_CONTEXT) += context.o context_arm.o context-db8500.o contex obj-$(CONFIG_U8500_CPUFREQ) += cpufreq.o obj-$(CONFIG_UX500_SUSPEND) += suspend.o obj-$(CONFIG_UX500_SUSPEND_DBG) += suspend_dbg.o + +ifeq ($(CONFIG_UX500_SOC_DB8500), y) +obj-$(CONFIG_U8500_CPUFREQ) += cpufreq-db8500.o +endif diff --git a/arch/arm/mach-ux500/pm/cpufreq-db8500.c b/arch/arm/mach-ux500/pm/cpufreq-db8500.c new file mode 100644 index 00000000000..c5f16a373ce --- /dev/null +++ b/arch/arm/mach-ux500/pm/cpufreq-db8500.c @@ -0,0 +1,53 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + */ + +#include <linux/kernel.h> +#include <linux/cpufreq.h> + +#include <mach/prcmu-fw-api.h> + +#include "cpufreq.h" + +static struct cpufreq_frequency_table freq_table[] = { + [0] = { + .index = 0, + .frequency = 300000, + }, + [1] = { + .index = 1, + .frequency = 600000, + }, + [2] = { + /* Used for MAX_OPP, if available */ + .index = 2, + .frequency = CPUFREQ_TABLE_END, + }, + [3] = { + .index = 3, + .frequency = CPUFREQ_TABLE_END, + }, +}; + +static enum arm_opp idx2opp[] = { + ARM_50_OPP, + ARM_100_OPP, + ARM_MAX_OPP +}; + +static int __init u8500_cpufreq_register(void) +{ + BUILD_BUG_ON(ARRAY_SIZE(idx2opp) + 1 != ARRAY_SIZE(freq_table)); + + if (cpu_is_u8500v2() && !prcmu_is_u8400()) { + freq_table[0].frequency = 400000; + freq_table[1].frequency = 800000; + if (prcmu_has_arm_maxopp()) + freq_table[2].frequency = 1000000; + } + + return ux500_cpufreq_register(freq_table, idx2opp); +} +device_initcall(u8500_cpufreq_register); diff --git a/arch/arm/mach-ux500/pm/cpufreq.c b/arch/arm/mach-ux500/pm/cpufreq.c index a4ec0653e32..407c59dc213 100644 --- a/arch/arm/mach-ux500/pm/cpufreq.c +++ b/arch/arm/mach-ux500/pm/cpufreq.c @@ -17,31 +17,8 @@ #include <mach/prcmu-fw-api.h> #include <mach/prcmu-regs.h> -static struct cpufreq_frequency_table freq_table[] = { - [0] = { - .index = 0, - .frequency = 300000, - }, - [1] = { - .index = 1, - .frequency = 600000, - }, - [2] = { - /* Used for MAX_OPP, if available */ - .index = 2, - .frequency = CPUFREQ_TABLE_END, - }, - [3] = { - .index = 3, - .frequency = CPUFREQ_TABLE_END, - }, -}; - -static enum arm_opp idx2opp[] = { - ARM_50_OPP, - ARM_100_OPP, - ARM_MAX_OPP -}; +static struct cpufreq_frequency_table *freq_table; +static enum arm_opp *idx2opp; static struct freq_attr *u8500_cpufreq_attr[] = { &cpufreq_freq_attr_scaling_available_freqs, @@ -108,15 +85,6 @@ static int __cpuinit u8500_cpufreq_init(struct cpufreq_policy *policy) int res; int i; - BUILD_BUG_ON(ARRAY_SIZE(idx2opp) + 1 != ARRAY_SIZE(freq_table)); - - if (cpu_is_u8500v2() && !prcmu_is_u8400()) { - freq_table[0].frequency = 400000; - freq_table[1].frequency = 800000; - if (prcmu_has_arm_maxopp()) - freq_table[2].frequency = 1000000; - } - /* get policy fields based on the table */ res = cpufreq_frequency_table_cpuinfo(policy, freq_table); if (!res) @@ -160,12 +128,16 @@ static struct cpufreq_driver u8500_cpufreq_driver = { .attr = u8500_cpufreq_attr, }; -static int __init u8500_cpufreq_register(void) +int __init +ux500_cpufreq_register(struct cpufreq_frequency_table *table, + enum arm_opp *idx2opplist) { + freq_table = table; + idx2opp = idx2opplist; + if (cpu_is_u8500v1() || ux500_is_svp()) return -ENODEV; pr_info("cpufreq for u8500 started\n"); return cpufreq_register_driver(&u8500_cpufreq_driver); } -device_initcall(u8500_cpufreq_register); diff --git a/arch/arm/mach-ux500/pm/cpufreq.h b/arch/arm/mach-ux500/pm/cpufreq.h new file mode 100644 index 00000000000..dc8744078f5 --- /dev/null +++ b/arch/arm/mach-ux500/pm/cpufreq.h @@ -0,0 +1,12 @@ +/* + * Copyright (C) ST-Ericsson SA 2011 + * + * License Terms: GNU General Public License v2 + */ +#ifndef __UX500_PM_CPUFREQ_H +#define __UX500_PM_CPUFREQ_H + +extern int ux500_cpufreq_register(struct cpufreq_frequency_table *freq_table, + enum arm_opp *idx2opp); + +#endif |