first renamed release maemo24
[kernel-power] / kernel-power-2.6.28 / debian / patches / overclock.diff
1 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/omap3-opp.h
2 +++ kernel-power-2.6.28/arch/arm/mach-omap2/omap3-opp.h
3 @@ -4,13 +4,23 @@
4  #include <mach/omap-pm.h>
5  
6  /* MPU speeds */
7 +#define S1150M  1150000000
8 +#define S1100M  1100000000
9 +#define S1000M  1000000000
10 +#define S950M   950000000
11 +#define S900M   900000000
12 +#define S850M   850000000
13 +#define S805M   805000000
14 +#define S750M   750000000
15 +#define S700M   700000000
16  #define S600M   600000000
17  #define S550M   550000000
18  #define S500M   500000000
19  #define S250M   250000000
20 -#define S125M   125000000
21 +#define S125M   124999000 /* temporary workaround to ignore telephone app's stubborn request for the lowest available frequency */
22  
23  /* DSP speeds */
24 +#define S520M   520000000
25  #define S430M   430000000
26  #define S400M   400000000
27  #define S360M   360000000
28 @@ -21,42 +31,8 @@
29  #define S83M    83000000
30  #define S166M   166000000
31  
32 -static struct omap_opp omap3_mpu_rate_table[] = {
33 -       {0, 0, 0},
34 -       /*OPP1*/
35 -       {0, VDD1_OPP1, 0x1E},
36 -       /*OPP2*/
37 -       {S250M, VDD1_OPP2, 0x26},
38 -       /*OPP3*/
39 -       {S500M, VDD1_OPP3, 0x30},
40 -       /*OPP4*/
41 -       {S550M, VDD1_OPP4, 0x36},
42 -       /*OPP5*/
43 -       {S600M, VDD1_OPP5, 0x3C},
44 -};
45 -
46 -static struct omap_opp omap3_l3_rate_table[] = {
47 -       {0, 0, 0},
48 -       /*OPP1*/
49 -       {0, VDD2_OPP1, 0x1E},
50 -       /*OPP2*/
51 -       {S83M, VDD2_OPP2, 0x24},
52 -       /*OPP3*/
53 -       {S166M, VDD2_OPP3, 0x2C},
54 -};
55 -
56 -static struct omap_opp omap3_dsp_rate_table[] = {
57 -       {0, 0, 0},
58 -       /*OPP1*/
59 -       {S90M, VDD1_OPP1, 0x1E},
60 -       /*OPP2*/
61 -       {S180M, VDD1_OPP2, 0x26},
62 -       /*OPP3*/
63 -       {S360M, VDD1_OPP3, 0x30},
64 -       /*OPP4*/
65 -       {S400M, VDD1_OPP4, 0x36},
66 -       /*OPP5*/
67 -       {S430M, VDD1_OPP5, 0x3C},
68 -};
69 +extern struct omap_opp omap3_mpu_rate_table[];
70 +extern struct omap_opp omap3_dsp_rate_table[];
71 +extern struct omap_opp omap3_l3_rate_table[];
72  
73  #endif
74 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/include/mach/omap34xx.h
75 +++ kernel-power-2.6.28/arch/arm/plat-omap/include/mach/omap34xx.h
76 @@ -114,7 +114,8 @@
77  #define VDD2_OPP3      0x3
78  
79  #define MIN_VDD1_OPP   VDD1_OPP1
80 -#define MAX_VDD1_OPP   VDD1_OPP5
81 +/*#define MAX_VDD1_OPP VDD1_OPP5*/
82 +#define MAX_VDD1_OPP   15
83  #define MIN_VDD2_OPP   VDD2_OPP1
84  #define MAX_VDD2_OPP   VDD2_OPP3
85  
86 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/smartreflex.c
87 +++ kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.c
88 @@ -513,7 +513,7 @@
89         sr->req_opp_no = target_opp_no;
90  
91         if (sr->srid == SR1) {
92 -               switch (target_opp_no) {
93 +               switch (min(target_opp_no-1,5)) {
94                 case 5:
95                         nvalue_reciprocal = sr->opp5_nvalue;
96                         break;
97 @@ -527,6 +527,7 @@
98                         nvalue_reciprocal = sr->opp2_nvalue;
99                         break;
100                 case 1:
101 +               case 0:
102                         nvalue_reciprocal = sr->opp1_nvalue;
103                         break;
104                 default:
105 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/cpu-omap.c
106 +++ kernel-power-2.6.28/arch/arm/plat-omap/cpu-omap.c
107 @@ -148,10 +148,13 @@
108                                                         VERY_HI_RATE) / 1000;
109         }
110  
111 -       clk_set_rate(mpu_clk, policy->cpuinfo.max_freq * 1000);
112 +       /*clk_set_rate(mpu_clk, policy->cpuinfo.max_freq * 1000);*/
113 +       clk_set_rate(mpu_clk, 600000 * 1000); /*N900 hack: set default max to 600MHz */
114  
115 -       policy->min = policy->cpuinfo.min_freq;
116 -       policy->max = policy->cpuinfo.max_freq;
117 +       /*policy->min = policy->cpuinfo.min_freq;*/
118 +       /*policy->max = policy->cpuinfo.max_freq;*/
119 +       policy->min = 250000;
120 +       policy->max = 600000; /*N900 hack: set default to 250-600MHz */
121         policy->cur = omap_getspeed(0);
122  
123         policy->cpuinfo.transition_latency = 300 * 1000;
124 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/smartreflex.h
125 +++ kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.h
126 @@ -254,7 +254,7 @@
127  /* XXX: end remove/move */
128  
129  /* SR_MAX_LOW_OPP: the highest of the "low OPPs", 1 and 2. */
130 -#define SR_MAX_LOW_OPP         2
131 +#define SR_MAX_LOW_OPP         3
132  
133  /* XXX: find more appropriate place for these once DVFS is in place */
134  extern u32 current_vdd1_opp;
135 --- kernel-power-2.6.28.orig/drivers/cpufreq/cpufreq.c
136 +++ kernel-power-2.6.28/drivers/cpufreq/cpufreq.c
137 @@ -465,7 +465,7 @@
138  /**
139   * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
140   */
141 -#define store_one(file_name, object)                   \
142 +#define store_one(file_name, object,ignore)                    \
143  static ssize_t store_##file_name                                       \
144  (struct cpufreq_policy *policy, const char *buf, size_t count)         \
145  {                                                                      \
146 @@ -479,15 +479,15 @@
147         ret = sscanf (buf, "%u", &new_policy.object);                   \
148         if (ret != 1)                                                   \
149                 return -EINVAL;                                         \
150 -                                                                       \
151 -       ret = __cpufreq_set_policy(policy, &new_policy);                \
152 +       if (new_policy.object != ignore && new_policy.object >= 100000) \
153 +           ret = __cpufreq_set_policy(policy, &new_policy);            \
154         policy->user_policy.object = policy->object;                    \
155                                                                         \
156         return ret ? ret : count;                                       \
157  }
158  
159 -store_one(scaling_min_freq,min);
160 -store_one(scaling_max_freq,max);
161 +store_one(scaling_min_freq,min,0);
162 +store_one(scaling_max_freq,max,600000);
163  
164  /**
165   * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
166 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/pm.c
167 +++ kernel-power-2.6.28/arch/arm/mach-omap2/pm.c
168 @@ -39,6 +39,62 @@
169  #include "prm-regbits-34xx.h"
170  #include "pm.h"
171  #include "smartreflex.h"
172 +#include "resource34xx_mutex.h"
173 +#include "omap3-opp.h"
174 +
175 +struct omap_opp omap3_mpu_rate_table[] = {
176 +       {0, 0, 0},
177 +       {0, 1, 0x1E},
178 +       /*underclocking*/
179 +       {S125M, 2, 0x1E},
180 +       /*default*/
181 +       {S250M, 3, 0x26},
182 +       {S500M, 4, 0x30},
183 +       {S550M, 5, 0x36},
184 +       {S600M, 6, 0x3C},
185 +       /*overclocking*/
186 +       {S700M, 7, 0x3C},
187 +       {S750M, 8, 0x3C},
188 +       {S805M, 9, 0x3C},
189 +       {S850M, 10, 0x3C},
190 +       {S900M, 11, 0x3C},
191 +       {S950M, 12, 0x3C},
192 +       {S1000M, 13, 0x3C},
193 +       {S1100M, 14, 0x48},
194 +       {S1150M, 15, 0x48},
195 +};
196 +
197 +struct omap_opp omap3_l3_rate_table[] = {
198 +       {0, 0, 0},
199 +       /*OPP1*/
200 +       {0, VDD2_OPP1, 0x1E},
201 +       /*OPP2*/
202 +       {S83M, VDD2_OPP2, 0x24},
203 +       /*OPP3*/
204 +       {S166M, VDD2_OPP3, 0x2C},
205 +};
206 +
207 +struct omap_opp omap3_dsp_rate_table[] = {
208 +       {0, 0, 0},
209 +       /*underclocking*/
210 +       {S90M,  1, 0x1E},
211 +       /*default*/
212 +       {S90M,  2, 0x1E},
213 +       {S180M, 3, 0x26},
214 +       {S360M, 4, 0x30},
215 +       {S400M, 5, 0x36},
216 +       {S430M, 6, 0x3C},
217 +       /*overclocking*/
218 +       {S430M, 7, 0x3C},
219 +       {S430M, 8, 0x3C},
220 +       {S430M, 9, 0x3C},/*800MHz*/
221 +       {S500M, 10, 0x3C},
222 +       {S500M, 11, 0x3C},
223 +       {S500M, 12, 0x3C},
224 +       {S500M, 13, 0x3C},
225 +       {S520M, 14, 0x48},
226 +       {S520M, 15, 0x48},
227 +};
228  
229  unsigned short enable_dyn_sleep;
230  unsigned short clocks_off_while_idle;
231 @@ -81,6 +137,108 @@
232  
233  #endif
234  
235 +static ssize_t omap_vdd1_opps_vsel_show(struct kobject *kobj,
236 +                                       struct kobj_attribute *attr, char *buf)
237 +{
238 +       int i;
239 +       char *b=buf;
240 +       for(i=1;i<=MAX_VDD1_OPP;i++)
241 +               b+=sprintf(b, "%hu ", mpu_opps[i].vsel);
242 +       b+=sprintf(b, "\n");
243 +       return b-buf;
244 +}
245 +
246 +static ssize_t omap_vdd1_opps_vsel_store(struct kobject *kobj,
247 +                                       struct kobj_attribute *attr,
248 +                                       const char *buf, size_t n)
249 +{
250 +       u16 value[16];
251 +       int i;
252 +
253 +       if (sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu",
254 +                               &value[0], &value[1], &value[2], &value[3],
255 +                               &value[4], &value[5], &value[6], &value[7],
256 +                               &value[8], &value[9], &value[10], &value[11],
257 +                               &value[12], &value[13], &value[14], &value[15]
258 +                               ) != MAX_VDD1_OPP) {
259 +               printk(KERN_ERR "vdd1_opps_vsel: Invalid value\n");
260 +               return -EINVAL;
261 +       }
262 +
263 +       mutex_lock(&dvfs_mutex);
264 +
265 +       for(i=1;i<=MAX_VDD1_OPP;i++) {
266 +               if(value[i-1]<0x49) {
267 +                       mpu_opps[i].vsel = value[i-1];
268 +               }
269 +       }
270 +
271 +       mutex_unlock(&dvfs_mutex);
272 +
273 +       return n;
274 +}
275 +
276 +static struct kobj_attribute vdd1_opps_vsel = {
277 +       .attr = {
278 +       .name = __stringify(vdd1_opps_vsel),
279 +       .mode = 0644,
280 +       },
281 +       .show = omap_vdd1_opps_vsel_show,
282 +       .store = omap_vdd1_opps_vsel_store,
283 +};
284 +
285 +static ssize_t omap_dsp_opps_rate_show(struct kobject *kobj,
286 +                                       struct kobj_attribute *attr, char *buf)
287 +{
288 +       int i;
289 +       char *b=buf;
290 +       for(i=1;i<=MAX_VDD1_OPP;i++)
291 +               b+=sprintf(b, "%u ", (u16) (dsp_opps[i].rate/1000000));
292 +       b+=sprintf(b, "\n");
293 +       return b-buf;
294 +}
295 +
296 +static ssize_t omap_dsp_opps_rate_store(struct kobject *kobj,
297 +                                       struct kobj_attribute *attr,
298 +                                       const char *buf, size_t n)
299 +{
300 +       u16 value[16];
301 +       int i;
302 +
303 +       if (sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu",
304 +                               &value[0], &value[1], &value[2], &value[3],
305 +                               &value[4], &value[5], &value[6], &value[7],
306 +                               &value[8], &value[9], &value[10], &value[11],
307 +                               &value[12], &value[13], &value[14], &value[15]
308 +                               ) != MAX_VDD1_OPP) {
309 +               printk(KERN_ERR "dsp_opps_rate: Invalid value\n");
310 +               return -EINVAL;
311 +       }
312 +
313 +       mutex_lock(&dvfs_mutex);
314 +
315 +       for(i=1;i<=MAX_VDD1_OPP;i++) {
316 +               if(value[i-1]<=600) {
317 +                       dsp_opps[i].rate = 1000000 * (u32)value[i-1];
318 +               }
319 +       }
320 +
321 +       mutex_unlock(&dvfs_mutex);
322 +
323 +       return n;
324 +}
325 +
326 +static struct kobj_attribute dsp_opps_rate = {
327 +       .attr = {
328 +       .name = __stringify(dsp_opps_rate),
329 +       .mode = 0644,
330 +       },
331 +       .show = omap_dsp_opps_rate_show,
332 +       .store = omap_dsp_opps_rate_store,
333 +};
334 +
335 +
336 +
337  static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr,
338                          char *buf)
339  {
340 @@ -258,6 +416,17 @@
341                 printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
342                 return error;
343         }
344 +       error = sysfs_create_file(power_kobj, &vdd1_opps_vsel.attr);
345 +       if (error) {
346 +               printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
347 +               return error;
348 +       }
349 +       error = sysfs_create_file(power_kobj, &dsp_opps_rate.attr);
350 +       if (error) {
351 +               printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
352 +               return error;
353 +       }
354 +
355  #ifdef CONFIG_OMAP_PM_SRF
356         error = sysfs_create_file(power_kobj,
357                                   &vdd1_opp_attr.attr);