diff options
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/db8500-cpufreq.c | 67 |
1 files changed, 25 insertions, 42 deletions
diff --git a/drivers/cpufreq/db8500-cpufreq.c b/drivers/cpufreq/db8500-cpufreq.c index 7d61a6c3e707..dea9a49023d7 100644 --- a/drivers/cpufreq/db8500-cpufreq.c +++ b/drivers/cpufreq/db8500-cpufreq.c | |||
@@ -17,36 +17,7 @@ | |||
17 | #include <linux/mfd/dbx500-prcmu.h> | 17 | #include <linux/mfd/dbx500-prcmu.h> |
18 | #include <mach/id.h> | 18 | #include <mach/id.h> |
19 | 19 | ||
20 | static struct cpufreq_frequency_table freq_table[] = { | 20 | static struct cpufreq_frequency_table *freq_table; |
21 | [0] = { | ||
22 | .index = 0, | ||
23 | .frequency = 200000, | ||
24 | }, | ||
25 | [1] = { | ||
26 | .index = 1, | ||
27 | .frequency = 400000, | ||
28 | }, | ||
29 | [2] = { | ||
30 | .index = 2, | ||
31 | .frequency = 800000, | ||
32 | }, | ||
33 | [3] = { | ||
34 | /* Used for MAX_OPP, if available */ | ||
35 | .index = 3, | ||
36 | .frequency = CPUFREQ_TABLE_END, | ||
37 | }, | ||
38 | [4] = { | ||
39 | .index = 4, | ||
40 | .frequency = CPUFREQ_TABLE_END, | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | static enum arm_opp idx2opp[] = { | ||
45 | ARM_EXTCLK, | ||
46 | ARM_50_OPP, | ||
47 | ARM_100_OPP, | ||
48 | ARM_MAX_OPP | ||
49 | }; | ||
50 | 21 | ||
51 | static struct freq_attr *db8500_cpufreq_attr[] = { | 22 | static struct freq_attr *db8500_cpufreq_attr[] = { |
52 | &cpufreq_freq_attr_scaling_available_freqs, | 23 | &cpufreq_freq_attr_scaling_available_freqs, |
@@ -88,7 +59,7 @@ static int db8500_cpufreq_target(struct cpufreq_policy *policy, | |||
88 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 59 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
89 | 60 | ||
90 | /* request the PRCM unit for opp change */ | 61 | /* request the PRCM unit for opp change */ |
91 | if (prcmu_set_arm_opp(idx2opp[idx])) { | 62 | if (prcmu_set_arm_opp(freq_table[idx].index)) { |
92 | pr_err("db8500-cpufreq: Failed to set OPP level\n"); | 63 | pr_err("db8500-cpufreq: Failed to set OPP level\n"); |
93 | return -EINVAL; | 64 | return -EINVAL; |
94 | } | 65 | } |
@@ -102,25 +73,30 @@ static int db8500_cpufreq_target(struct cpufreq_policy *policy, | |||
102 | 73 | ||
103 | static unsigned int db8500_cpufreq_getspeed(unsigned int cpu) | 74 | static unsigned int db8500_cpufreq_getspeed(unsigned int cpu) |
104 | { | 75 | { |
105 | int i; | 76 | int i = 0; |
106 | /* request the prcm to get the current ARM opp */ | 77 | /* request the prcm to get the current ARM opp */ |
107 | for (i = 0; prcmu_get_arm_opp() != idx2opp[i]; i++) | 78 | int opp = prcmu_get_arm_opp(); |
108 | ; | 79 | |
109 | return freq_table[i].frequency; | 80 | while (freq_table[i].frequency != CPUFREQ_TABLE_END) { |
81 | if (opp == freq_table[i].index) | ||
82 | return freq_table[i].frequency; | ||
83 | i++; | ||
84 | } | ||
85 | |||
86 | /* We could not find a corresponding opp frequency. */ | ||
87 | return 0; | ||
110 | } | 88 | } |
111 | 89 | ||
112 | static int __cpuinit db8500_cpufreq_init(struct cpufreq_policy *policy) | 90 | static int __cpuinit db8500_cpufreq_init(struct cpufreq_policy *policy) |
113 | { | 91 | { |
114 | int i, res; | 92 | int i = 0; |
115 | 93 | int res; | |
116 | BUILD_BUG_ON(ARRAY_SIZE(idx2opp) + 1 != ARRAY_SIZE(freq_table)); | ||
117 | |||
118 | if (prcmu_has_arm_maxopp()) | ||
119 | freq_table[3].frequency = 1000000; | ||
120 | 94 | ||
121 | pr_info("db8500-cpufreq : Available frequencies:\n"); | 95 | pr_info("db8500-cpufreq : Available frequencies:\n"); |
122 | for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) | 96 | while (freq_table[i].frequency != CPUFREQ_TABLE_END) { |
123 | pr_info(" %d Mhz\n", freq_table[i].frequency/1000); | 97 | pr_info(" %d Mhz\n", freq_table[i].frequency/1000); |
98 | i++; | ||
99 | } | ||
124 | 100 | ||
125 | /* get policy fields based on the table */ | 101 | /* get policy fields based on the table */ |
126 | res = cpufreq_frequency_table_cpuinfo(policy, freq_table); | 102 | res = cpufreq_frequency_table_cpuinfo(policy, freq_table); |
@@ -163,6 +139,13 @@ static struct cpufreq_driver db8500_cpufreq_driver = { | |||
163 | 139 | ||
164 | static int db8500_cpufreq_probe(struct platform_device *pdev) | 140 | static int db8500_cpufreq_probe(struct platform_device *pdev) |
165 | { | 141 | { |
142 | freq_table = dev_get_platdata(&pdev->dev); | ||
143 | |||
144 | if (!freq_table) { | ||
145 | pr_err("db8500-cpufreq: Failed to fetch cpufreq table\n"); | ||
146 | return -ENODEV; | ||
147 | } | ||
148 | |||
166 | return cpufreq_register_driver(&db8500_cpufreq_driver); | 149 | return cpufreq_register_driver(&db8500_cpufreq_driver); |
167 | } | 150 | } |
168 | 151 | ||