diff options
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/Kconfig.arm | 44 | ||||
-rw-r--r-- | drivers/cpufreq/Kconfig.powerpc | 2 | ||||
-rw-r--r-- | drivers/cpufreq/Makefile | 9 | ||||
-rw-r--r-- | drivers/cpufreq/exynos-cpufreq.c | 33 | ||||
-rw-r--r-- | drivers/cpufreq/s3c2416-cpufreq.c | 4 | ||||
-rw-r--r-- | drivers/cpufreq/s3c24xx-cpufreq.c | 10 |
6 files changed, 67 insertions, 35 deletions
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 0f9a2c3c0e0d..1b06fc4640e2 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
@@ -26,13 +26,21 @@ config ARM_VEXPRESS_SPC_CPUFREQ | |||
26 | 26 | ||
27 | 27 | ||
28 | config ARM_EXYNOS_CPUFREQ | 28 | config ARM_EXYNOS_CPUFREQ |
29 | bool | 29 | tristate "SAMSUNG EXYNOS CPUfreq Driver" |
30 | depends on CPU_EXYNOS4210 || SOC_EXYNOS4212 || SOC_EXYNOS4412 || SOC_EXYNOS5250 | ||
31 | depends on THERMAL | ||
32 | help | ||
33 | This adds the CPUFreq driver for Samsung EXYNOS platforms. | ||
34 | Supported SoC versions are: | ||
35 | Exynos4210, Exynos4212, Exynos4412, and Exynos5250. | ||
36 | |||
37 | If in doubt, say N. | ||
30 | 38 | ||
31 | config ARM_EXYNOS4210_CPUFREQ | 39 | config ARM_EXYNOS4210_CPUFREQ |
32 | bool "SAMSUNG EXYNOS4210" | 40 | bool "SAMSUNG EXYNOS4210" |
33 | depends on CPU_EXYNOS4210 | 41 | depends on CPU_EXYNOS4210 |
42 | depends on ARM_EXYNOS_CPUFREQ | ||
34 | default y | 43 | default y |
35 | select ARM_EXYNOS_CPUFREQ | ||
36 | help | 44 | help |
37 | This adds the CPUFreq driver for Samsung EXYNOS4210 | 45 | This adds the CPUFreq driver for Samsung EXYNOS4210 |
38 | SoC (S5PV310 or S5PC210). | 46 | SoC (S5PV310 or S5PC210). |
@@ -42,8 +50,8 @@ config ARM_EXYNOS4210_CPUFREQ | |||
42 | config ARM_EXYNOS4X12_CPUFREQ | 50 | config ARM_EXYNOS4X12_CPUFREQ |
43 | bool "SAMSUNG EXYNOS4x12" | 51 | bool "SAMSUNG EXYNOS4x12" |
44 | depends on SOC_EXYNOS4212 || SOC_EXYNOS4412 | 52 | depends on SOC_EXYNOS4212 || SOC_EXYNOS4412 |
53 | depends on ARM_EXYNOS_CPUFREQ | ||
45 | default y | 54 | default y |
46 | select ARM_EXYNOS_CPUFREQ | ||
47 | help | 55 | help |
48 | This adds the CPUFreq driver for Samsung EXYNOS4X12 | 56 | This adds the CPUFreq driver for Samsung EXYNOS4X12 |
49 | SoC (EXYNOS4212 or EXYNOS4412). | 57 | SoC (EXYNOS4212 or EXYNOS4412). |
@@ -53,28 +61,14 @@ config ARM_EXYNOS4X12_CPUFREQ | |||
53 | config ARM_EXYNOS5250_CPUFREQ | 61 | config ARM_EXYNOS5250_CPUFREQ |
54 | bool "SAMSUNG EXYNOS5250" | 62 | bool "SAMSUNG EXYNOS5250" |
55 | depends on SOC_EXYNOS5250 | 63 | depends on SOC_EXYNOS5250 |
64 | depends on ARM_EXYNOS_CPUFREQ | ||
56 | default y | 65 | default y |
57 | select ARM_EXYNOS_CPUFREQ | ||
58 | help | 66 | help |
59 | This adds the CPUFreq driver for Samsung EXYNOS5250 | 67 | This adds the CPUFreq driver for Samsung EXYNOS5250 |
60 | SoC. | 68 | SoC. |
61 | 69 | ||
62 | If in doubt, say N. | 70 | If in doubt, say N. |
63 | 71 | ||
64 | config ARM_EXYNOS5440_CPUFREQ | ||
65 | bool "SAMSUNG EXYNOS5440" | ||
66 | depends on SOC_EXYNOS5440 | ||
67 | depends on HAVE_CLK && OF | ||
68 | select PM_OPP | ||
69 | default y | ||
70 | help | ||
71 | This adds the CPUFreq driver for Samsung EXYNOS5440 | ||
72 | SoC. The nature of exynos5440 clock controller is | ||
73 | different than previous exynos controllers so not using | ||
74 | the common exynos framework. | ||
75 | |||
76 | If in doubt, say N. | ||
77 | |||
78 | config ARM_EXYNOS_CPU_FREQ_BOOST_SW | 72 | config ARM_EXYNOS_CPU_FREQ_BOOST_SW |
79 | bool "EXYNOS Frequency Overclocking - Software" | 73 | bool "EXYNOS Frequency Overclocking - Software" |
80 | depends on ARM_EXYNOS_CPUFREQ && THERMAL | 74 | depends on ARM_EXYNOS_CPUFREQ && THERMAL |
@@ -90,6 +84,20 @@ config ARM_EXYNOS_CPU_FREQ_BOOST_SW | |||
90 | 84 | ||
91 | If in doubt, say N. | 85 | If in doubt, say N. |
92 | 86 | ||
87 | config ARM_EXYNOS5440_CPUFREQ | ||
88 | tristate "SAMSUNG EXYNOS5440" | ||
89 | depends on SOC_EXYNOS5440 | ||
90 | depends on HAVE_CLK && OF | ||
91 | select PM_OPP | ||
92 | default y | ||
93 | help | ||
94 | This adds the CPUFreq driver for Samsung EXYNOS5440 | ||
95 | SoC. The nature of exynos5440 clock controller is | ||
96 | different than previous exynos controllers so not using | ||
97 | the common exynos framework. | ||
98 | |||
99 | If in doubt, say N. | ||
100 | |||
93 | config ARM_HIGHBANK_CPUFREQ | 101 | config ARM_HIGHBANK_CPUFREQ |
94 | tristate "Calxeda Highbank-based" | 102 | tristate "Calxeda Highbank-based" |
95 | depends on ARCH_HIGHBANK && CPUFREQ_DT && REGULATOR | 103 | depends on ARCH_HIGHBANK && CPUFREQ_DT && REGULATOR |
diff --git a/drivers/cpufreq/Kconfig.powerpc b/drivers/cpufreq/Kconfig.powerpc index 72564b701b4a..7ea24413cee6 100644 --- a/drivers/cpufreq/Kconfig.powerpc +++ b/drivers/cpufreq/Kconfig.powerpc | |||
@@ -26,7 +26,7 @@ config CPU_FREQ_MAPLE | |||
26 | config PPC_CORENET_CPUFREQ | 26 | config PPC_CORENET_CPUFREQ |
27 | tristate "CPU frequency scaling driver for Freescale E500MC SoCs" | 27 | tristate "CPU frequency scaling driver for Freescale E500MC SoCs" |
28 | depends on PPC_E500MC && OF && COMMON_CLK | 28 | depends on PPC_E500MC && OF && COMMON_CLK |
29 | select CLK_PPC_CORENET | 29 | select CLK_QORIQ |
30 | help | 30 | help |
31 | This adds the CPUFreq driver support for Freescale e500mc, | 31 | This adds the CPUFreq driver support for Freescale e500mc, |
32 | e5500 and e6500 series SoCs which are capable of changing | 32 | e5500 and e6500 series SoCs which are capable of changing |
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 8b4220ac888b..82a1821471fd 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile | |||
@@ -52,10 +52,11 @@ obj-$(CONFIG_ARM_DT_BL_CPUFREQ) += arm_big_little_dt.o | |||
52 | 52 | ||
53 | obj-$(CONFIG_ARCH_DAVINCI) += davinci-cpufreq.o | 53 | obj-$(CONFIG_ARCH_DAVINCI) += davinci-cpufreq.o |
54 | obj-$(CONFIG_UX500_SOC_DB8500) += dbx500-cpufreq.o | 54 | obj-$(CONFIG_UX500_SOC_DB8500) += dbx500-cpufreq.o |
55 | obj-$(CONFIG_ARM_EXYNOS_CPUFREQ) += exynos-cpufreq.o | 55 | obj-$(CONFIG_ARM_EXYNOS_CPUFREQ) += arm-exynos-cpufreq.o |
56 | obj-$(CONFIG_ARM_EXYNOS4210_CPUFREQ) += exynos4210-cpufreq.o | 56 | arm-exynos-cpufreq-y := exynos-cpufreq.o |
57 | obj-$(CONFIG_ARM_EXYNOS4X12_CPUFREQ) += exynos4x12-cpufreq.o | 57 | arm-exynos-cpufreq-$(CONFIG_ARM_EXYNOS4210_CPUFREQ) += exynos4210-cpufreq.o |
58 | obj-$(CONFIG_ARM_EXYNOS5250_CPUFREQ) += exynos5250-cpufreq.o | 58 | arm-exynos-cpufreq-$(CONFIG_ARM_EXYNOS4X12_CPUFREQ) += exynos4x12-cpufreq.o |
59 | arm-exynos-cpufreq-$(CONFIG_ARM_EXYNOS5250_CPUFREQ) += exynos5250-cpufreq.o | ||
59 | obj-$(CONFIG_ARM_EXYNOS5440_CPUFREQ) += exynos5440-cpufreq.o | 60 | obj-$(CONFIG_ARM_EXYNOS5440_CPUFREQ) += exynos5440-cpufreq.o |
60 | obj-$(CONFIG_ARM_HIGHBANK_CPUFREQ) += highbank-cpufreq.o | 61 | obj-$(CONFIG_ARM_HIGHBANK_CPUFREQ) += highbank-cpufreq.o |
61 | obj-$(CONFIG_ARM_IMX6Q_CPUFREQ) += imx6q-cpufreq.o | 62 | obj-$(CONFIG_ARM_IMX6Q_CPUFREQ) += imx6q-cpufreq.o |
diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c index f99a0b0b7c06..5e98c6b1f284 100644 --- a/drivers/cpufreq/exynos-cpufreq.c +++ b/drivers/cpufreq/exynos-cpufreq.c | |||
@@ -18,10 +18,13 @@ | |||
18 | #include <linux/cpufreq.h> | 18 | #include <linux/cpufreq.h> |
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <linux/of.h> | 20 | #include <linux/of.h> |
21 | #include <linux/cpu_cooling.h> | ||
22 | #include <linux/cpu.h> | ||
21 | 23 | ||
22 | #include "exynos-cpufreq.h" | 24 | #include "exynos-cpufreq.h" |
23 | 25 | ||
24 | static struct exynos_dvfs_info *exynos_info; | 26 | static struct exynos_dvfs_info *exynos_info; |
27 | static struct thermal_cooling_device *cdev; | ||
25 | static struct regulator *arm_regulator; | 28 | static struct regulator *arm_regulator; |
26 | static unsigned int locking_frequency; | 29 | static unsigned int locking_frequency; |
27 | 30 | ||
@@ -156,6 +159,7 @@ static struct cpufreq_driver exynos_driver = { | |||
156 | 159 | ||
157 | static int exynos_cpufreq_probe(struct platform_device *pdev) | 160 | static int exynos_cpufreq_probe(struct platform_device *pdev) |
158 | { | 161 | { |
162 | struct device_node *cpus, *np; | ||
159 | int ret = -EINVAL; | 163 | int ret = -EINVAL; |
160 | 164 | ||
161 | exynos_info = kzalloc(sizeof(*exynos_info), GFP_KERNEL); | 165 | exynos_info = kzalloc(sizeof(*exynos_info), GFP_KERNEL); |
@@ -198,9 +202,36 @@ static int exynos_cpufreq_probe(struct platform_device *pdev) | |||
198 | /* Done here as we want to capture boot frequency */ | 202 | /* Done here as we want to capture boot frequency */ |
199 | locking_frequency = clk_get_rate(exynos_info->cpu_clk) / 1000; | 203 | locking_frequency = clk_get_rate(exynos_info->cpu_clk) / 1000; |
200 | 204 | ||
201 | if (!cpufreq_register_driver(&exynos_driver)) | 205 | ret = cpufreq_register_driver(&exynos_driver); |
206 | if (ret) | ||
207 | goto err_cpufreq_reg; | ||
208 | |||
209 | cpus = of_find_node_by_path("/cpus"); | ||
210 | if (!cpus) { | ||
211 | pr_err("failed to find cpus node\n"); | ||
212 | return 0; | ||
213 | } | ||
214 | |||
215 | np = of_get_next_child(cpus, NULL); | ||
216 | if (!np) { | ||
217 | pr_err("failed to find cpus child node\n"); | ||
218 | of_node_put(cpus); | ||
202 | return 0; | 219 | return 0; |
220 | } | ||
221 | |||
222 | if (of_find_property(np, "#cooling-cells", NULL)) { | ||
223 | cdev = of_cpufreq_cooling_register(np, | ||
224 | cpu_present_mask); | ||
225 | if (IS_ERR(cdev)) | ||
226 | pr_err("running cpufreq without cooling device: %ld\n", | ||
227 | PTR_ERR(cdev)); | ||
228 | } | ||
229 | of_node_put(np); | ||
230 | of_node_put(cpus); | ||
231 | |||
232 | return 0; | ||
203 | 233 | ||
234 | err_cpufreq_reg: | ||
204 | dev_err(&pdev->dev, "failed to register cpufreq driver\n"); | 235 | dev_err(&pdev->dev, "failed to register cpufreq driver\n"); |
205 | regulator_put(arm_regulator); | 236 | regulator_put(arm_regulator); |
206 | err_vdd_arm: | 237 | err_vdd_arm: |
diff --git a/drivers/cpufreq/s3c2416-cpufreq.c b/drivers/cpufreq/s3c2416-cpufreq.c index 2fd53eaaec20..d6d425773fa4 100644 --- a/drivers/cpufreq/s3c2416-cpufreq.c +++ b/drivers/cpufreq/s3c2416-cpufreq.c | |||
@@ -263,7 +263,7 @@ out: | |||
263 | } | 263 | } |
264 | 264 | ||
265 | #ifdef CONFIG_ARM_S3C2416_CPUFREQ_VCORESCALE | 265 | #ifdef CONFIG_ARM_S3C2416_CPUFREQ_VCORESCALE |
266 | static void __init s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq) | 266 | static void s3c2416_cpufreq_cfg_regulator(struct s3c2416_data *s3c_freq) |
267 | { | 267 | { |
268 | int count, v, i, found; | 268 | int count, v, i, found; |
269 | struct cpufreq_frequency_table *pos; | 269 | struct cpufreq_frequency_table *pos; |
@@ -333,7 +333,7 @@ static struct notifier_block s3c2416_cpufreq_reboot_notifier = { | |||
333 | .notifier_call = s3c2416_cpufreq_reboot_notifier_evt, | 333 | .notifier_call = s3c2416_cpufreq_reboot_notifier_evt, |
334 | }; | 334 | }; |
335 | 335 | ||
336 | static int __init s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy) | 336 | static int s3c2416_cpufreq_driver_init(struct cpufreq_policy *policy) |
337 | { | 337 | { |
338 | struct s3c2416_data *s3c_freq = &s3c2416_cpufreq; | 338 | struct s3c2416_data *s3c_freq = &s3c2416_cpufreq; |
339 | struct cpufreq_frequency_table *pos; | 339 | struct cpufreq_frequency_table *pos; |
diff --git a/drivers/cpufreq/s3c24xx-cpufreq.c b/drivers/cpufreq/s3c24xx-cpufreq.c index d00f1cee4509..733aa5153e74 100644 --- a/drivers/cpufreq/s3c24xx-cpufreq.c +++ b/drivers/cpufreq/s3c24xx-cpufreq.c | |||
@@ -144,11 +144,6 @@ static void s3c_cpufreq_setfvco(struct s3c_cpufreq_config *cfg) | |||
144 | (cfg->info->set_fvco)(cfg); | 144 | (cfg->info->set_fvco)(cfg); |
145 | } | 145 | } |
146 | 146 | ||
147 | static inline void s3c_cpufreq_resume_clocks(void) | ||
148 | { | ||
149 | cpu_cur.info->resume_clocks(); | ||
150 | } | ||
151 | |||
152 | static inline void s3c_cpufreq_updateclk(struct clk *clk, | 147 | static inline void s3c_cpufreq_updateclk(struct clk *clk, |
153 | unsigned int freq) | 148 | unsigned int freq) |
154 | { | 149 | { |
@@ -417,9 +412,6 @@ static int s3c_cpufreq_resume(struct cpufreq_policy *policy) | |||
417 | 412 | ||
418 | last_target = ~0; /* invalidate last_target setting */ | 413 | last_target = ~0; /* invalidate last_target setting */ |
419 | 414 | ||
420 | /* first, find out what speed we resumed at. */ | ||
421 | s3c_cpufreq_resume_clocks(); | ||
422 | |||
423 | /* whilst we will be called later on, we try and re-set the | 415 | /* whilst we will be called later on, we try and re-set the |
424 | * cpu frequencies as soon as possible so that we do not end | 416 | * cpu frequencies as soon as possible so that we do not end |
425 | * up resuming devices and then immediately having to re-set | 417 | * up resuming devices and then immediately having to re-set |
@@ -454,7 +446,7 @@ static struct cpufreq_driver s3c24xx_driver = { | |||
454 | }; | 446 | }; |
455 | 447 | ||
456 | 448 | ||
457 | int __init s3c_cpufreq_register(struct s3c_cpufreq_info *info) | 449 | int s3c_cpufreq_register(struct s3c_cpufreq_info *info) |
458 | { | 450 | { |
459 | if (!info || !info->name) { | 451 | if (!info || !info->name) { |
460 | printk(KERN_ERR "%s: failed to pass valid information\n", | 452 | printk(KERN_ERR "%s: failed to pass valid information\n", |