diff options
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/Kconfig.arm | 4 | ||||
-rw-r--r-- | drivers/cpufreq/Kconfig.x86 | 6 | ||||
-rw-r--r-- | drivers/cpufreq/Makefile | 2 | ||||
-rw-r--r-- | drivers/cpufreq/dbx500-cpufreq.c (renamed from drivers/cpufreq/db8500-cpufreq.c) | 105 | ||||
-rw-r--r-- | drivers/cpufreq/exynos-cpufreq.c | 4 | ||||
-rw-r--r-- | drivers/cpufreq/exynos-cpufreq.h | 48 | ||||
-rw-r--r-- | drivers/cpufreq/exynos4210-cpufreq.c | 3 | ||||
-rw-r--r-- | drivers/cpufreq/exynos4x12-cpufreq.c | 3 | ||||
-rw-r--r-- | drivers/cpufreq/exynos5250-cpufreq.c | 3 |
9 files changed, 113 insertions, 65 deletions
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 7f333af1c05..030ddf6dd3f 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm @@ -21,8 +21,8 @@ config ARM_S3C2416_CPUFREQ If in doubt, say N. config ARM_S3C2416_CPUFREQ_VCORESCALE - bool "Allow voltage scaling for S3C2416 arm core (EXPERIMENTAL)" - depends on ARM_S3C2416_CPUFREQ && REGULATOR && EXPERIMENTAL + bool "Allow voltage scaling for S3C2416 arm core" + depends on ARM_S3C2416_CPUFREQ && REGULATOR help Enable CPU voltage scaling when entering the dvs mode. It uses information gathered through existing hardware and diff --git a/drivers/cpufreq/Kconfig.x86 b/drivers/cpufreq/Kconfig.x86 index 98e5abbe8f2..d7dc0ed6adb 100644 --- a/drivers/cpufreq/Kconfig.x86 +++ b/drivers/cpufreq/Kconfig.x86 @@ -187,7 +187,7 @@ config X86_SPEEDSTEP_ICH config X86_SPEEDSTEP_SMI tristate "Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface)" select CPU_FREQ_TABLE - depends on X86_32 && EXPERIMENTAL + depends on X86_32 help This adds the CPUFreq driver for certain mobile Intel Pentium III (Coppermine), all mobile Intel Pentium III-M (Tualatin) @@ -219,7 +219,7 @@ config X86_P4_CLOCKMOD config X86_CPUFREQ_NFORCE2 tristate "nVidia nForce2 FSB changing" - depends on X86_32 && EXPERIMENTAL + depends on X86_32 help This adds the CPUFreq driver for FSB changing on nVidia nForce2 platforms. @@ -255,7 +255,7 @@ config X86_LONGHAUL config X86_E_POWERSAVER tristate "VIA C7 Enhanced PowerSaver (DANGEROUS)" select CPU_FREQ_TABLE - depends on X86_32 && EXPERIMENTAL + depends on X86_32 help This adds the CPUFreq driver for VIA C7 processors. However, this driver does not have any safeguards to prevent operating the CPU out of spec diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 5399c45ac31..863fd1865d4 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile @@ -44,7 +44,7 @@ obj-$(CONFIG_X86_INTEL_PSTATE) += intel_pstate.o ################################################################################## # ARM SoC drivers -obj-$(CONFIG_UX500_SOC_DB8500) += db8500-cpufreq.o +obj-$(CONFIG_UX500_SOC_DB8500) += dbx500-cpufreq.o obj-$(CONFIG_ARM_S3C2416_CPUFREQ) += s3c2416-cpufreq.o obj-$(CONFIG_ARM_S3C64XX_CPUFREQ) += s3c64xx-cpufreq.o obj-$(CONFIG_ARM_S5PV210_CPUFREQ) += s5pv210-cpufreq.o diff --git a/drivers/cpufreq/db8500-cpufreq.c b/drivers/cpufreq/dbx500-cpufreq.c index 79a84860ea5..72f0c3efa76 100644 --- a/drivers/cpufreq/db8500-cpufreq.c +++ b/drivers/cpufreq/dbx500-cpufreq.c @@ -1,13 +1,13 @@ /* * Copyright (C) STMicroelectronics 2009 - * Copyright (C) ST-Ericsson SA 2010 + * Copyright (C) ST-Ericsson SA 2010-2012 * * License Terms: GNU General Public License v2 * Author: Sundar Iyer <sundar.iyer@stericsson.com> * Author: Martin Persson <martin.persson@stericsson.com> * Author: Jonas Aaberg <jonas.aberg@stericsson.com> - * */ + #include <linux/module.h> #include <linux/kernel.h> #include <linux/cpufreq.h> @@ -15,27 +15,27 @@ #include <linux/slab.h> #include <linux/platform_device.h> #include <linux/clk.h> -#include <mach/id.h> static struct cpufreq_frequency_table *freq_table; static struct clk *armss_clk; -static struct freq_attr *db8500_cpufreq_attr[] = { +static struct freq_attr *dbx500_cpufreq_attr[] = { &cpufreq_freq_attr_scaling_available_freqs, NULL, }; -static int db8500_cpufreq_verify_speed(struct cpufreq_policy *policy) +static int dbx500_cpufreq_verify_speed(struct cpufreq_policy *policy) { return cpufreq_frequency_table_verify(policy, freq_table); } -static int db8500_cpufreq_target(struct cpufreq_policy *policy, +static int dbx500_cpufreq_target(struct cpufreq_policy *policy, unsigned int target_freq, unsigned int relation) { struct cpufreq_freqs freqs; unsigned int idx; + int ret; /* scale the target frequency to one of the extremes supported */ if (target_freq < policy->cpuinfo.min_freq) @@ -44,10 +44,9 @@ static int db8500_cpufreq_target(struct cpufreq_policy *policy, target_freq = policy->cpuinfo.max_freq; /* Lookup the next frequency */ - if (cpufreq_frequency_table_target - (policy, freq_table, target_freq, relation, &idx)) { + if (cpufreq_frequency_table_target(policy, freq_table, target_freq, + relation, &idx)) return -EINVAL; - } freqs.old = policy->cur; freqs.new = freq_table[idx].frequency; @@ -60,9 +59,12 @@ static int db8500_cpufreq_target(struct cpufreq_policy *policy, cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); /* update armss clk frequency */ - if (clk_set_rate(armss_clk, freq_table[idx].frequency * 1000)) { - pr_err("db8500-cpufreq: Failed to update armss clk\n"); - return -EINVAL; + ret = clk_set_rate(armss_clk, freqs.new * 1000); + + if (ret) { + pr_err("dbx500-cpufreq: Failed to set armss_clk to %d Hz: error %d\n", + freqs.new * 1000, ret); + return ret; } /* post change notification */ @@ -72,7 +74,7 @@ static int db8500_cpufreq_target(struct cpufreq_policy *policy, return 0; } -static unsigned int db8500_cpufreq_getspeed(unsigned int cpu) +static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu) { int i = 0; unsigned long freq = clk_get_rate(armss_clk) / 1000; @@ -84,40 +86,26 @@ static unsigned int db8500_cpufreq_getspeed(unsigned int cpu) } /* We could not find a corresponding frequency. */ - pr_err("db8500-cpufreq: Failed to find cpufreq speed\n"); + pr_err("dbx500-cpufreq: Failed to find cpufreq speed\n"); return 0; } -static int __cpuinit db8500_cpufreq_init(struct cpufreq_policy *policy) +static int __cpuinit dbx500_cpufreq_init(struct cpufreq_policy *policy) { - int i = 0; int res; - armss_clk = clk_get(NULL, "armss"); - if (IS_ERR(armss_clk)) { - pr_err("db8500-cpufreq : Failed to get armss clk\n"); - return PTR_ERR(armss_clk); - } - - pr_info("db8500-cpufreq : Available frequencies:\n"); - while (freq_table[i].frequency != CPUFREQ_TABLE_END) { - pr_info(" %d Mhz\n", freq_table[i].frequency/1000); - i++; - } - /* get policy fields based on the table */ res = cpufreq_frequency_table_cpuinfo(policy, freq_table); if (!res) cpufreq_frequency_table_get_attr(freq_table, policy->cpu); else { - pr_err("db8500-cpufreq : Failed to read policy table\n"); - clk_put(armss_clk); + pr_err("dbx500-cpufreq: Failed to read policy table\n"); return res; } policy->min = policy->cpuinfo.min_freq; policy->max = policy->cpuinfo.max_freq; - policy->cur = db8500_cpufreq_getspeed(policy->cpu); + policy->cur = dbx500_cpufreq_getspeed(policy->cpu); policy->governor = CPUFREQ_DEFAULT_GOVERNOR; /* @@ -133,45 +121,54 @@ static int __cpuinit db8500_cpufreq_init(struct cpufreq_policy *policy) return 0; } -static struct cpufreq_driver db8500_cpufreq_driver = { - .flags = CPUFREQ_STICKY, - .verify = db8500_cpufreq_verify_speed, - .target = db8500_cpufreq_target, - .get = db8500_cpufreq_getspeed, - .init = db8500_cpufreq_init, - .name = "DB8500", - .attr = db8500_cpufreq_attr, +static struct cpufreq_driver dbx500_cpufreq_driver = { + .flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS, + .verify = dbx500_cpufreq_verify_speed, + .target = dbx500_cpufreq_target, + .get = dbx500_cpufreq_getspeed, + .init = dbx500_cpufreq_init, + .name = "DBX500", + .attr = dbx500_cpufreq_attr, }; -static int db8500_cpufreq_probe(struct platform_device *pdev) +static int dbx500_cpufreq_probe(struct platform_device *pdev) { - freq_table = dev_get_platdata(&pdev->dev); + int i = 0; + freq_table = dev_get_platdata(&pdev->dev); if (!freq_table) { - pr_err("db8500-cpufreq: Failed to fetch cpufreq table\n"); + pr_err("dbx500-cpufreq: Failed to fetch cpufreq table\n"); return -ENODEV; } - return cpufreq_register_driver(&db8500_cpufreq_driver); + armss_clk = clk_get(&pdev->dev, "armss"); + if (IS_ERR(armss_clk)) { + pr_err("dbx500-cpufreq: Failed to get armss clk\n"); + return PTR_ERR(armss_clk); + } + + pr_info("dbx500-cpufreq: Available frequencies:\n"); + while (freq_table[i].frequency != CPUFREQ_TABLE_END) { + pr_info(" %d Mhz\n", freq_table[i].frequency/1000); + i++; + } + + return cpufreq_register_driver(&dbx500_cpufreq_driver); } -static struct platform_driver db8500_cpufreq_plat_driver = { +static struct platform_driver dbx500_cpufreq_plat_driver = { .driver = { - .name = "cpufreq-u8500", + .name = "cpufreq-ux500", .owner = THIS_MODULE, }, - .probe = db8500_cpufreq_probe, + .probe = dbx500_cpufreq_probe, }; -static int __init db8500_cpufreq_register(void) +static int __init dbx500_cpufreq_register(void) { - if (!cpu_is_u8500_family()) - return -ENODEV; - - pr_info("cpufreq for DB8500 started\n"); - return platform_driver_register(&db8500_cpufreq_plat_driver); + return platform_driver_register(&dbx500_cpufreq_plat_driver); } -device_initcall(db8500_cpufreq_register); +device_initcall(dbx500_cpufreq_register); MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("cpufreq driver for DB8500"); +MODULE_DESCRIPTION("cpufreq driver for DBX500"); diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c index 69b676dd335..78057a357dd 100644 --- a/drivers/cpufreq/exynos-cpufreq.c +++ b/drivers/cpufreq/exynos-cpufreq.c @@ -18,10 +18,10 @@ #include <linux/cpufreq.h> #include <linux/suspend.h> -#include <mach/cpufreq.h> - #include <plat/cpu.h> +#include "exynos-cpufreq.h" + static struct exynos_dvfs_info *exynos_info; static struct regulator *arm_regulator; diff --git a/drivers/cpufreq/exynos-cpufreq.h b/drivers/cpufreq/exynos-cpufreq.h new file mode 100644 index 00000000000..92b852ee5dd --- /dev/null +++ b/drivers/cpufreq/exynos-cpufreq.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2010 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * EXYNOS - CPUFreq support + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +enum cpufreq_level_index { + L0, L1, L2, L3, L4, + L5, L6, L7, L8, L9, + L10, L11, L12, L13, L14, + L15, L16, L17, L18, L19, + L20, +}; + +#define APLL_FREQ(f, a0, a1, a2, a3, a4, a5, a6, a7, b0, b1, b2, m, p, s) \ + { \ + .freq = (f) * 1000, \ + .clk_div_cpu0 = ((a0) | (a1) << 4 | (a2) << 8 | (a3) << 12 | \ + (a4) << 16 | (a5) << 20 | (a6) << 24 | (a7) << 28), \ + .clk_div_cpu1 = (b0 << 0 | b1 << 4 | b2 << 8), \ + .mps = ((m) << 16 | (p) << 8 | (s)), \ + } + +struct apll_freq { + unsigned int freq; + u32 clk_div_cpu0; + u32 clk_div_cpu1; + u32 mps; +}; + +struct exynos_dvfs_info { + unsigned long mpll_freq_khz; + unsigned int pll_safe_idx; + struct clk *cpu_clk; + unsigned int *volt_table; + struct cpufreq_frequency_table *freq_table; + void (*set_freq)(unsigned int, unsigned int); + bool (*need_apll_change)(unsigned int, unsigned int); +}; + +extern int exynos4210_cpufreq_init(struct exynos_dvfs_info *); +extern int exynos4x12_cpufreq_init(struct exynos_dvfs_info *); +extern int exynos5250_cpufreq_init(struct exynos_dvfs_info *); diff --git a/drivers/cpufreq/exynos4210-cpufreq.c b/drivers/cpufreq/exynos4210-cpufreq.c index de91755e255..add7fbec4fc 100644 --- a/drivers/cpufreq/exynos4210-cpufreq.c +++ b/drivers/cpufreq/exynos4210-cpufreq.c @@ -18,7 +18,8 @@ #include <linux/cpufreq.h> #include <mach/regs-clock.h> -#include <mach/cpufreq.h> + +#include "exynos-cpufreq.h" static struct clk *cpu_clk; static struct clk *moutcore; diff --git a/drivers/cpufreq/exynos4x12-cpufreq.c b/drivers/cpufreq/exynos4x12-cpufreq.c index 0661039e5d4..08b7477b0aa 100644 --- a/drivers/cpufreq/exynos4x12-cpufreq.c +++ b/drivers/cpufreq/exynos4x12-cpufreq.c @@ -18,7 +18,8 @@ #include <linux/cpufreq.h> #include <mach/regs-clock.h> -#include <mach/cpufreq.h> + +#include "exynos-cpufreq.h" static struct clk *cpu_clk; static struct clk *moutcore; diff --git a/drivers/cpufreq/exynos5250-cpufreq.c b/drivers/cpufreq/exynos5250-cpufreq.c index b9344869f82..9fae466d774 100644 --- a/drivers/cpufreq/exynos5250-cpufreq.c +++ b/drivers/cpufreq/exynos5250-cpufreq.c @@ -19,7 +19,8 @@ #include <mach/map.h> #include <mach/regs-clock.h> -#include <mach/cpufreq.h> + +#include "exynos-cpufreq.h" static struct clk *cpu_clk; static struct clk *moutcore; |