aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2013-04-04 08:54:17 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-04-10 07:19:25 -0400
commit81c720c90e6fbda5a1f53f932035de899f27adb6 (patch)
tree04a21b626b16a0d39b9270ac89c831f28d8132ab /drivers/cpufreq
parent59a2e613d07fbd592ff711c87458eabcf9c98902 (diff)
cpufreq: AVR32: move cpufreq driver to drivers/cpufreq
This patch moves cpufreq driver of AVR32 based at32ap platform to drivers/cpufreq. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r--drivers/cpufreq/Kconfig13
-rw-r--r--drivers/cpufreq/Makefile4
-rw-r--r--drivers/cpufreq/at32ap-cpufreq.c123
3 files changed, 140 insertions, 0 deletions
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index cbcb21e32771..d7ce6ccf5c91 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -205,6 +205,19 @@ depends on ARM
205source "drivers/cpufreq/Kconfig.arm" 205source "drivers/cpufreq/Kconfig.arm"
206endmenu 206endmenu
207 207
208menu "AVR32 CPU frequency scaling drivers"
209depends on AVR32
210
211config AVR32_AT32AP_CPUFREQ
212 bool "CPU frequency driver for AT32AP"
213 depends on PLATFORM_AT32AP
214 default n
215 help
216 This enables the CPU frequency driver for AT32AP processors.
217 If in doubt, say N.
218
219endmenu
220
208menu "PowerPC CPU frequency scaling drivers" 221menu "PowerPC CPU frequency scaling drivers"
209depends on PPC32 || PPC64 222depends on PPC32 || PPC64
210source "drivers/cpufreq/Kconfig.powerpc" 223source "drivers/cpufreq/Kconfig.powerpc"
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
index 8b21016ac157..2701acafd65b 100644
--- a/drivers/cpufreq/Makefile
+++ b/drivers/cpufreq/Makefile
@@ -74,3 +74,7 @@ obj-$(CONFIG_ARCH_TEGRA) += tegra-cpufreq.o
74################################################################################## 74##################################################################################
75# PowerPC platform drivers 75# PowerPC platform drivers
76obj-$(CONFIG_CPU_FREQ_MAPLE) += maple-cpufreq.o 76obj-$(CONFIG_CPU_FREQ_MAPLE) += maple-cpufreq.o
77
78##################################################################################
79# Other platform drivers
80obj-$(CONFIG_AVR32_AT32AP_CPUFREQ) += at32ap-cpufreq.o
diff --git a/drivers/cpufreq/at32ap-cpufreq.c b/drivers/cpufreq/at32ap-cpufreq.c
new file mode 100644
index 000000000000..654488723cb5
--- /dev/null
+++ b/drivers/cpufreq/at32ap-cpufreq.c
@@ -0,0 +1,123 @@
1/*
2 * Copyright (C) 2004-2007 Atmel Corporation
3 *
4 * Based on MIPS implementation arch/mips/kernel/time.c
5 * Copyright 2001 MontaVista Software Inc.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12/*#define DEBUG*/
13
14#include <linux/kernel.h>
15#include <linux/types.h>
16#include <linux/init.h>
17#include <linux/cpufreq.h>
18#include <linux/io.h>
19#include <linux/clk.h>
20#include <linux/err.h>
21#include <linux/export.h>
22
23static struct clk *cpuclk;
24
25static int at32_verify_speed(struct cpufreq_policy *policy)
26{
27 if (policy->cpu != 0)
28 return -EINVAL;
29
30 cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
31 policy->cpuinfo.max_freq);
32 return 0;
33}
34
35static unsigned int at32_get_speed(unsigned int cpu)
36{
37 /* No SMP support */
38 if (cpu)
39 return 0;
40 return (unsigned int)((clk_get_rate(cpuclk) + 500) / 1000);
41}
42
43static unsigned int ref_freq;
44static unsigned long loops_per_jiffy_ref;
45
46static int at32_set_target(struct cpufreq_policy *policy,
47 unsigned int target_freq,
48 unsigned int relation)
49{
50 struct cpufreq_freqs freqs;
51 long freq;
52
53 /* Convert target_freq from kHz to Hz */
54 freq = clk_round_rate(cpuclk, target_freq * 1000);
55
56 /* Check if policy->min <= new_freq <= policy->max */
57 if(freq < (policy->min * 1000) || freq > (policy->max * 1000))
58 return -EINVAL;
59
60 pr_debug("cpufreq: requested frequency %u Hz\n", target_freq * 1000);
61
62 freqs.old = at32_get_speed(0);
63 freqs.new = (freq + 500) / 1000;
64 freqs.flags = 0;
65
66 if (!ref_freq) {
67 ref_freq = freqs.old;
68 loops_per_jiffy_ref = boot_cpu_data.loops_per_jiffy;
69 }
70
71 cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE);
72 if (freqs.old < freqs.new)
73 boot_cpu_data.loops_per_jiffy = cpufreq_scale(
74 loops_per_jiffy_ref, ref_freq, freqs.new);
75 clk_set_rate(cpuclk, freq);
76 if (freqs.new < freqs.old)
77 boot_cpu_data.loops_per_jiffy = cpufreq_scale(
78 loops_per_jiffy_ref, ref_freq, freqs.new);
79 cpufreq_notify_transition(policy, &freqs, CPUFREQ_POSTCHANGE);
80
81 pr_debug("cpufreq: set frequency %lu Hz\n", freq);
82
83 return 0;
84}
85
86static int __init at32_cpufreq_driver_init(struct cpufreq_policy *policy)
87{
88 if (policy->cpu != 0)
89 return -EINVAL;
90
91 cpuclk = clk_get(NULL, "cpu");
92 if (IS_ERR(cpuclk)) {
93 pr_debug("cpufreq: could not get CPU clk\n");
94 return PTR_ERR(cpuclk);
95 }
96
97 policy->cpuinfo.min_freq = (clk_round_rate(cpuclk, 1) + 500) / 1000;
98 policy->cpuinfo.max_freq = (clk_round_rate(cpuclk, ~0UL) + 500) / 1000;
99 policy->cpuinfo.transition_latency = 0;
100 policy->cur = at32_get_speed(0);
101 policy->min = policy->cpuinfo.min_freq;
102 policy->max = policy->cpuinfo.max_freq;
103
104 printk("cpufreq: AT32AP CPU frequency driver\n");
105
106 return 0;
107}
108
109static struct cpufreq_driver at32_driver = {
110 .name = "at32ap",
111 .owner = THIS_MODULE,
112 .init = at32_cpufreq_driver_init,
113 .verify = at32_verify_speed,
114 .target = at32_set_target,
115 .get = at32_get_speed,
116 .flags = CPUFREQ_STICKY,
117};
118
119static int __init at32_cpufreq_init(void)
120{
121 return cpufreq_register_driver(&at32_driver);
122}
123late_initcall(at32_cpufreq_init);