--- /dev/null
+diff -urN kernel-power-2.6.28/arch/arm/mach-omap2/omap3-opp.h kernel-power-2.6.28.SR/arch/arm/mach-omap2/omap3-opp.h
+--- kernel-power-2.6.28/arch/arm/mach-omap2/omap3-opp.h 2011-10-11 13:51:21.441301622 +0100
++++ kernel-power-2.6.28.SR/arch/arm/mach-omap2/omap3-opp.h 2011-10-22 16:31:45.291911000 +0100
+@@ -11,8 +11,7 @@
+ #define S900M 900000000
+ #define S850M 850000000
+ #define S805M 805000000
+-#define S750M 750000000
+-#define S700M 700000000
++#define S720M 720000000
+ #define S600M 600000000
+ #define S550M 550000000
+ #define S500M 500000000
+diff -urN kernel-power-2.6.28/arch/arm/mach-omap2/pm.c kernel-power-2.6.28.SR/arch/arm/mach-omap2/pm.c
+--- kernel-power-2.6.28/arch/arm/mach-omap2/pm.c 2011-10-11 13:51:21.444897248 +0100
++++ kernel-power-2.6.28.SR/arch/arm/mach-omap2/pm.c 2011-10-30 07:29:47.355582000 +0000
+@@ -44,25 +44,23 @@
+
+ struct omap_opp omap3_mpu_rate_table[] = {
+ {0, 0, 0},
+- {0, 1, 0x1E},
+- /*underclocking*/
+- {S125M, 2, 0x1E},
+ /*default*/
+- {S250M, 3, 0x26},
+- {S500M, 4, 0x30},
+- {S550M, 5, 0x36},
+- {S600M, 6, 0x3C},
++ {S125M, VDD1_OPP1, 0x1E},
++ {S250M, VDD1_OPP2, 0x26},
++ {S500M, VDD1_OPP3, 0x30},
++ {S550M, VDD1_OPP4, 0x36},
++ {S600M, VDD1_OPP5, 0x3C},
+ /*overclocking*/
+- {S700M, 7, 0x3C},
+- {S750M, 8, 0x3C},
+- {S805M, 9, 0x3C},
+- {S850M, 10, 0x3C},
+- {S900M, 11, 0x3C},
+- {S950M, 12, 0x3C},
+- {S1000M, 13, 0x3C},
+- {S1100M, 14, 0x48},
+- {S1150M, 15, 0x48},
++ {S720M, VDD1_OPP6, 0x3C},
++ {S805M, VDD1_OPP7, 0x3C},
++ {S850M, VDD1_OPP8, 0x3C},
++ {S900M, VDD1_OPP9, 0x3C},
++ {S950M, VDD1_OPP10, 0x3C},
++ {S1000M,VDD1_OPP11, 0x3C},
++ {S1100M,VDD1_OPP12, 0x48},
++ {S1150M,VDD1_OPP13, 0x48},
+ };
++EXPORT_SYMBOL(omap3_mpu_rate_table);
+
+ struct omap_opp omap3_l3_rate_table[] = {
+ {0, 0, 0},
+@@ -76,25 +74,23 @@
+
+ struct omap_opp omap3_dsp_rate_table[] = {
+ {0, 0, 0},
+- /*underclocking*/
+- {S90M, 1, 0x1E},
+ /*default*/
+- {S90M, 2, 0x1E},
+- {S180M, 3, 0x26},
+- {S360M, 4, 0x30},
+- {S400M, 5, 0x36},
+- {S430M, 6, 0x3C},
++ {S90M, VDD1_OPP1, 0x1E},
++ {S180M, VDD1_OPP2, 0x26},
++ {S360M, VDD1_OPP3, 0x30},
++ {S400M, VDD1_OPP4, 0x36},
++ {S430M, VDD1_OPP5, 0x3C},
+ /*overclocking*/
+- {S430M, 7, 0x3C},
+- {S430M, 8, 0x3C},
+- {S430M, 9, 0x3C},/*800MHz*/
+- {S500M, 10, 0x3C},
+- {S500M, 11, 0x3C},
+- {S500M, 12, 0x3C},
+- {S500M, 13, 0x3C},
+- {S520M, 14, 0x48},
+- {S520M, 15, 0x48},
++ {S520M, VDD1_OPP6, 0x3C},
++ {S520M, VDD1_OPP7, 0x3C},
++ {S520M, VDD1_OPP8, 0x3C},
++ {S520M, VDD1_OPP9, 0x3C},
++ {S520M, VDD1_OPP10, 0x3C},
++ {S520M, VDD1_OPP11, 0x3C},
++ {S520M, VDD1_OPP12, 0x48},
++ {S520M, VDD1_OPP13, 0x48},
+ };
++EXPORT_SYMBOL(omap3_dsp_rate_table);
+
+ unsigned short enable_dyn_sleep;
+ unsigned short clocks_off_while_idle;
+@@ -342,13 +338,13 @@
+ }
+
+ if (attr == &vdd1_opp_attr) {
+- if (value < 1 || value > 5) {
++ if (value < MIN_VDD1_OPP || value > MAX_VDD1_OPP) {
+ printk(KERN_ERR "vdd_opp_store: Invalid value\n");
+ return -EINVAL;
+ }
+ resource_set_opp_level(PRCM_VDD1, value, flags);
+ } else if (attr == &vdd2_opp_attr) {
+- if (value < 1 || value > 3) {
++ if (value < MIN_VDD2_OPP || value > MAX_VDD2_OPP) {
+ printk(KERN_ERR "vdd_opp_store: Invalid value\n");
+ return -EINVAL;
+ }
+diff -urN kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.c kernel-power-2.6.28.SR/arch/arm/mach-omap2/smartreflex.c
+--- kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.c 2011-10-11 13:51:21.441301622 +0100
++++ kernel-power-2.6.28.SR/arch/arm/mach-omap2/smartreflex.c 2011-10-22 14:15:45.469275000 +0100
+@@ -81,7 +81,8 @@
+ u32 clk_length;
+ u32 req_opp_no;
+ u32 opp1_nvalue, opp2_nvalue, opp3_nvalue, opp4_nvalue;
+- u32 opp5_nvalue;
++ u32 opp5_nvalue;\r
++ u32 opp6_nvalue, opp7_nvalue;
+ u32 senp_mod, senn_mod;
+ void __iomem *srbase_addr;
+ void __iomem *vpbase_addr;
+@@ -164,6 +165,29 @@
+ }
+ }
+ }
++void sr_calculate_rg(u32 rfuse, u32 gain_fuse, u32 delta_nt,\r
++ u32 *rnsen, u32 *sengain)\r
++{\r
++ u32 nadj;\r
++ nadj = ((1 << (gain_fuse + 8)) / rfuse) + delta_nt;\r
++ cal_reciprocal(nadj, sengain, rnsen);\r
++}\r
++\r
++static u32 calculate_opp_nvalue(u32 opp5_nvalue, u32 delta_p, u32 delta_n)\r
++{\r
++ u32 sen_pgain_fuse, sen_ngain_fuse, sen_prn_fuse, sen_nrn_fuse;\r
++ u32 sen_nrn, sen_ngain, sen_prn, sen_pgain;\r
++ sen_pgain_fuse = (opp5_nvalue & 0x00F0000) >> 0x14;\r
++ sen_ngain_fuse = (opp5_nvalue & 0x000F0000) >> 0x10;\r
++ sen_prn_fuse = (opp5_nvalue & 0x0000FF00) >> 0x08;\r
++ sen_nrn_fuse = (opp5_nvalue & 0x000000FF);\r
++ sr_calculate_rg(sen_nrn_fuse, sen_ngain_fuse, delta_n, &sen_nrn,\r
++ &sen_ngain);\r
++ sr_calculate_rg(sen_prn_fuse, sen_pgain_fuse, delta_p, &sen_prn,\r
++ &sen_pgain);\r
++ return (sen_pgain << 0x14) | (sen_ngain << 0x10)\r
++ | (sen_prn << 0x08) | (sen_nrn);\r
++}\r
+
+ static u32 cal_test_nvalue(u32 sennval, u32 senpval)
+ {
+@@ -231,6 +255,10 @@
+ OMAP343X_CONTROL_FUSE_OPP2_VDD1);
+ sr->opp1_nvalue = omap_ctrl_readl(
+ OMAP343X_CONTROL_FUSE_OPP1_VDD1);
++ if (sr->opp5_nvalue) {\r
++ sr->opp6_nvalue = calculate_opp_nvalue(sr->opp5_nvalue, 227, 379);\r
++ sr->opp7_nvalue = calculate_opp_nvalue(sr->opp5_nvalue, 434, 730);\r
++ }\r
+ } else if (sr->srid == SR2) {
+ sr->senn_mod = (omap_ctrl_readl(OMAP343X_CONTROL_FUSE_SR) &
+ OMAP343X_SR2_SENNENABLE_MASK) >>
+@@ -262,6 +290,10 @@
+ sr->opp3_nvalue = cal_test_nvalue(0x85b + 0x200, 0x655 + 0x200);
+ sr->opp2_nvalue = cal_test_nvalue(0x506 + 0x1a0, 0x3be + 0x1a0);
+ sr->opp1_nvalue = cal_test_nvalue(0x373 + 0x100, 0x28c + 0x100);
++ if (sr->opp5_nvalue) {\r
++ sr->opp6_nvalue = calculate_opp_nvalue(sr->opp5_nvalue, 227, 379);\r
++ sr->opp7_nvalue = calculate_opp_nvalue(sr->opp5_nvalue, 434, 730);\r
++ }\r
+ } else if (sr->srid == SR2) {
+ sr->senp_mod = 0x03;
+ sr->senn_mod = 0x03;
+@@ -513,7 +545,13 @@
+ sr->req_opp_no = target_opp_no;
+
+ if (sr->srid == SR1) {
+- switch (min(target_opp_no-1,5)) {
++ switch (min(target_opp_no-1,7)) {
++ case 7:\r
++ nvalue_reciprocal = sr->opp7_nvalue;\r
++ break;\r
++ case 6:\r
++ nvalue_reciprocal = sr->opp6_nvalue;\r
++ break;\r
+ case 5:
+ nvalue_reciprocal = sr->opp5_nvalue;
+ break;
+diff -urN kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.h kernel-power-2.6.28.SR/arch/arm/mach-omap2/smartreflex.h
+--- kernel-power-2.6.28/arch/arm/mach-omap2/smartreflex.h 2011-10-11 13:51:21.441301622 +0100
++++ kernel-power-2.6.28.SR/arch/arm/mach-omap2/smartreflex.h 2011-10-22 13:52:40.850113000 +0100
+@@ -240,7 +240,11 @@
+ ID_VDD(PRCM_VDD1) | ID_OPP_NO(0x4))
+ #define PRCM_VDD1_OPP5 (OMAP(AT_3430_ES2) | OTHER_ID_TYPE(ID_OPP) | \
+ ID_VDD(PRCM_VDD1) | ID_OPP_NO(0x5))
+-#define PRCM_NO_VDD1_OPPS 5
++#define PRCM_VDD1_OPP6 (OMAP(AT_3430_ES2) | OTHER_ID_TYPE(ID_OPP) | \\r
++ ID_VDD(PRCM_VDD1) | ID_OPP_NO(0x6))\r
++#define PRCM_VDD1_OPP7 (OMAP(AT_3430_ES2) | OTHER_ID_TYPE(ID_OPP) | \\r
++ ID_VDD(PRCM_VDD1) | ID_OPP_NO(0x7))\r
++#define PRCM_NO_VDD1_OPPS 7
+
+
+ /* VDD2 OPPs */
+diff -urN kernel-power-2.6.28/arch/arm/plat-omap/include/mach/omap34xx.h kernel-power-2.6.28.SR/arch/arm/plat-omap/include/mach/omap34xx.h
+--- kernel-power-2.6.28/arch/arm/plat-omap/include/mach/omap34xx.h 2011-10-11 13:51:21.441301622 +0100
++++ kernel-power-2.6.28.SR/arch/arm/plat-omap/include/mach/omap34xx.h 2011-10-22 15:52:18.063235000 +0100
+@@ -107,6 +107,14 @@
+ #define VDD1_OPP3 0x3
+ #define VDD1_OPP4 0x4
+ #define VDD1_OPP5 0x5
++#define VDD1_OPP6 0x6\r
++#define VDD1_OPP7 0x7\r
++#define VDD1_OPP8 0x8\r
++#define VDD1_OPP9 0x9\r
++#define VDD1_OPP10 0xA\r
++#define VDD1_OPP11 0xB\r
++#define VDD1_OPP12 0xC\r
++#define VDD1_OPP13 0xD\r
+
+ /* VDD2 OPPS */
+ #define VDD2_OPP1 0x1
+@@ -114,8 +122,7 @@
+ #define VDD2_OPP3 0x3
+
+ #define MIN_VDD1_OPP VDD1_OPP1
+-/*#define MAX_VDD1_OPP VDD1_OPP5*/
+-#define MAX_VDD1_OPP 15
++#define MAX_VDD1_OPP VDD1_OPP13
+ #define MIN_VDD2_OPP VDD2_OPP1
+ #define MAX_VDD2_OPP VDD2_OPP3
+