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
4 #include <mach/omap-pm.h>
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
20 #define S125M 125000000
23 +#define S520M 520000000
24 #define S430M 430000000
25 #define S400M 400000000
26 #define S360M 360000000
29 #define S166M 166000000
31 -static struct omap_opp omap3_mpu_rate_table[] = {
34 - {0, VDD1_OPP1, 0x1E},
36 - {S250M, VDD1_OPP2, 0x26},
38 - {S500M, VDD1_OPP3, 0x30},
40 - {S550M, VDD1_OPP4, 0x36},
42 - {S600M, VDD1_OPP5, 0x3C},
45 -static struct omap_opp omap3_l3_rate_table[] = {
48 - {0, VDD2_OPP1, 0x1E},
50 - {S83M, VDD2_OPP2, 0x24},
52 - {S166M, VDD2_OPP3, 0x2C},
55 -static struct omap_opp omap3_dsp_rate_table[] = {
58 - {S90M, VDD1_OPP1, 0x1E},
60 - {S180M, VDD1_OPP2, 0x26},
62 - {S360M, VDD1_OPP3, 0x30},
64 - {S400M, VDD1_OPP4, 0x36},
66 - {S430M, VDD1_OPP5, 0x3C},
68 +extern struct omap_opp omap3_mpu_rate_table[];
69 +extern struct omap_opp omap3_dsp_rate_table[];
70 +extern struct omap_opp omap3_l3_rate_table[];
73 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/include/mach/omap34xx.h
74 +++ kernel-power-2.6.28/arch/arm/plat-omap/include/mach/omap34xx.h
78 #define MIN_VDD1_OPP VDD1_OPP1
79 -#define MAX_VDD1_OPP VDD1_OPP5
80 +/*#define MAX_VDD1_OPP VDD1_OPP5*/
81 +#define MAX_VDD1_OPP 15
82 #define MIN_VDD2_OPP VDD2_OPP1
83 #define MAX_VDD2_OPP VDD2_OPP3
85 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/smartreflex.c
86 +++ kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.c
88 sr->req_opp_no = target_opp_no;
90 if (sr->srid == SR1) {
91 - switch (target_opp_no) {
92 + switch (min(target_opp_no-1,5)) {
94 nvalue_reciprocal = sr->opp5_nvalue;
97 nvalue_reciprocal = sr->opp2_nvalue;
101 nvalue_reciprocal = sr->opp1_nvalue;
104 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/cpu-omap.c
105 +++ kernel-power-2.6.28/arch/arm/plat-omap/cpu-omap.c
106 @@ -148,10 +148,13 @@
107 VERY_HI_RATE) / 1000;
110 - clk_set_rate(mpu_clk, policy->cpuinfo.max_freq * 1000);
111 + /*clk_set_rate(mpu_clk, policy->cpuinfo.max_freq * 1000);*/
112 + clk_set_rate(mpu_clk, 600000 * 1000); /*N900 hack: set default max to 600MHz */
114 - policy->min = policy->cpuinfo.min_freq;
115 - policy->max = policy->cpuinfo.max_freq;
116 + /*policy->min = policy->cpuinfo.min_freq;*/
117 + /*policy->max = policy->cpuinfo.max_freq;*/
118 + policy->min = 250000;
119 + policy->max = 600000; /*N900 hack: set default to 250-600MHz */
120 policy->cur = omap_getspeed(0);
122 policy->cpuinfo.transition_latency = 300 * 1000;
123 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/smartreflex.h
124 +++ kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.h
126 /* XXX: end remove/move */
128 /* SR_MAX_LOW_OPP: the highest of the "low OPPs", 1 and 2. */
129 -#define SR_MAX_LOW_OPP 2
130 +#define SR_MAX_LOW_OPP 3
132 /* XXX: find more appropriate place for these once DVFS is in place */
133 extern u32 current_vdd1_opp;
134 --- kernel-power-2.6.28.orig/drivers/cpufreq/cpufreq.c
135 +++ kernel-power-2.6.28/drivers/cpufreq/cpufreq.c
138 * cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
140 -#define store_one(file_name, object) \
141 +#define store_one(file_name, object,ignore,replace) \
142 static ssize_t store_##file_name \
143 (struct cpufreq_policy *policy, const char *buf, size_t count) \
145 @@ -479,15 +479,17 @@
146 ret = sscanf (buf, "%u", &new_policy.object); \
150 - ret = __cpufreq_set_policy(policy, &new_policy); \
151 + if (new_policy.object != ignore && new_policy.object >= 100000) { \
152 + if (new_policy.object == replace) new_policy.object = ignore; \
153 + ret = __cpufreq_set_policy(policy, &new_policy); \
155 policy->user_policy.object = policy->object; \
157 return ret ? ret : count; \
160 -store_one(scaling_min_freq,min);
161 -store_one(scaling_max_freq,max);
162 +store_one(scaling_min_freq,min,0,0);
163 +store_one(scaling_max_freq,max,600000,599000);
166 * show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
167 --- kernel-power-2.6.28.orig/arch/arm/mach-omap2/pm.c
168 +++ kernel-power-2.6.28/arch/arm/mach-omap2/pm.c
170 #include "prm-regbits-34xx.h"
172 #include "smartreflex.h"
173 +#include "resource34xx_mutex.h"
174 +#include "omap3-opp.h"
176 +struct omap_opp omap3_mpu_rate_table[] = {
193 + {S1000M, 13, 0x3C},
194 + {S1100M, 14, 0x48},
195 + {S1150M, 15, 0x48},
198 +struct omap_opp omap3_l3_rate_table[] = {
201 + {0, VDD2_OPP1, 0x1E},
203 + {S83M, VDD2_OPP2, 0x24},
205 + {S166M, VDD2_OPP3, 0x2C},
208 +struct omap_opp omap3_dsp_rate_table[] = {
221 + {S430M, 9, 0x3C},/*800MHz*/
230 unsigned short enable_dyn_sleep;
231 unsigned short clocks_off_while_idle;
236 +static ssize_t omap_vdd1_opps_vsel_show(struct kobject *kobj,
237 + struct kobj_attribute *attr, char *buf)
241 + for(i=1;i<=MAX_VDD1_OPP;i++)
242 + b+=sprintf(b, "%hu ", mpu_opps[i].vsel);
243 + b+=sprintf(b, "\n");
247 +static ssize_t omap_vdd1_opps_vsel_store(struct kobject *kobj,
248 + struct kobj_attribute *attr,
249 + const char *buf, size_t n)
254 + if (sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu",
255 + &value[0], &value[1], &value[2], &value[3],
256 + &value[4], &value[5], &value[6], &value[7],
257 + &value[8], &value[9], &value[10], &value[11],
258 + &value[12], &value[13], &value[14], &value[15]
259 + ) != MAX_VDD1_OPP) {
260 + printk(KERN_ERR "vdd1_opps_vsel: Invalid value\n");
264 + mutex_lock(&dvfs_mutex);
266 + for(i=1;i<=MAX_VDD1_OPP;i++) {
267 + if(value[i-1]<0x49) {
268 + mpu_opps[i].vsel = value[i-1];
272 + mutex_unlock(&dvfs_mutex);
277 +static struct kobj_attribute vdd1_opps_vsel = {
279 + .name = __stringify(vdd1_opps_vsel),
282 + .show = omap_vdd1_opps_vsel_show,
283 + .store = omap_vdd1_opps_vsel_store,
286 +static ssize_t omap_dsp_opps_rate_show(struct kobject *kobj,
287 + struct kobj_attribute *attr, char *buf)
291 + for(i=1;i<=MAX_VDD1_OPP;i++)
292 + b+=sprintf(b, "%u ", (u16) (dsp_opps[i].rate/1000000));
293 + b+=sprintf(b, "\n");
297 +static ssize_t omap_dsp_opps_rate_store(struct kobject *kobj,
298 + struct kobj_attribute *attr,
299 + const char *buf, size_t n)
304 + if (sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu",
305 + &value[0], &value[1], &value[2], &value[3],
306 + &value[4], &value[5], &value[6], &value[7],
307 + &value[8], &value[9], &value[10], &value[11],
308 + &value[12], &value[13], &value[14], &value[15]
309 + ) != MAX_VDD1_OPP) {
310 + printk(KERN_ERR "dsp_opps_rate: Invalid value\n");
314 + mutex_lock(&dvfs_mutex);
316 + for(i=1;i<=MAX_VDD1_OPP;i++) {
317 + if(value[i-1]<=600) {
318 + dsp_opps[i].rate = 1000000 * (u32)value[i-1];
322 + mutex_unlock(&dvfs_mutex);
327 +static struct kobj_attribute dsp_opps_rate = {
329 + .name = __stringify(dsp_opps_rate),
332 + .show = omap_dsp_opps_rate_show,
333 + .store = omap_dsp_opps_rate_store,
338 static ssize_t idle_show(struct kobject *kobj, struct kobj_attribute *attr,
342 printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
345 + error = sysfs_create_file(power_kobj, &vdd1_opps_vsel.attr);
347 + printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
350 + error = sysfs_create_file(power_kobj, &dsp_opps_rate.attr);
352 + printk(KERN_ERR "sysfs_create_file failed: %d\n", error);
356 #ifdef CONFIG_OMAP_PM_SRF
357 error = sysfs_create_file(power_kobj,
358 &vdd1_opp_attr.attr);
359 --- kernel-power-2.6.28.orig/drivers/cpufreq/cpufreq_ondemand.c
360 +++ kernel-power-2.6.28/drivers/cpufreq/cpufreq_ondemand.c
366 + avoid_frequencies_table[0] = 125000;
367 + avoid_frequencies_count=1;
369 idle_time = get_cpu_idle_time_us(cpu, &wall);
371 if (idle_time != -1ULL) {