Introduce the OMAP3630 OPPs including the defined OPP tuples.

Further information on OMAP3630 can be found here:
http://focus.ti.com/general/docs/wtbu/wtbuproductcontent.tsp?templateId=6123&navigationId=12836&contentId=52606

OMAP36xx family introduces:
VDD1 with 4 OPPs, of which OPP3 & 4 are available only on devices yet
to be introduced in 36xx family. Meanwhile, VDD2 has 2 opps.

Range of OPPs supported by Devices(tentative)->
           |<-3630-600->| (default)
           |<-      3630-800  ->| (device: TBD)
           |<-      3630-1000             ->| (device: TBD)
H/w OPP-> OPP50 OPP100       OPP-Turbo   OPP1G-SB
VDD1      OPP1  OPP2         OPP3        OPP4
VDD2      OPP1  OPP2         OPP2        OPP2

Note:
a) TI h/w naming for OPPs are now standardized in terms of OPP50, 100,
   Turbo and SB. This maps as shown above to the opp IDs (s/w term).
b) For boards which need custom VDD1/2 OPPs, the opp table can be
   updated by the board file on a need basis after the
   omap3_pm_init_opp_table call. The OPPs introduced here are the
   official OPP table at this point in time.

Tested on: SDP3430, SDP3630

Cc: Benoit Cousson <[email protected]>
Cc: Jon Hunter <[email protected]>
Cc: Kevin Hilman <[email protected]>
Cc: Madhusudhan Chikkature Rajashekar <[email protected]>
Cc: Paul Walmsley <[email protected]>
Cc: Romit Dasgupta <[email protected]>
Cc: Sanjeev Premi <[email protected]>
Cc: Santosh Shilimkar <[email protected]>
Cc: Sergio Alberto Aguirre Rodriguez <[email protected]>
Cc: SuiLun Lam <[email protected]>
Cc: Thara Gopinath <[email protected]>
Cc: Vishwanath Sripathy <[email protected]>

Signed-off-by: Nishanth Menon <[email protected]>
---
 arch/arm/mach-omap2/omap3-opp.h |    9 ++++
 arch/arm/mach-omap2/pm34xx.c    |   87 +++++++++++++++++++++++++++++++-------
 2 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/arch/arm/mach-omap2/omap3-opp.h b/arch/arm/mach-omap2/omap3-opp.h
index 7f27f44..a5880b8 100644
--- a/arch/arm/mach-omap2/omap3-opp.h
+++ b/arch/arm/mach-omap2/omap3-opp.h
@@ -4,22 +4,31 @@
 #include <plat/omap-pm.h>
 
 /* MPU speeds */
+#define S1000M  1000000000
+#define S800M   800000000
 #define S600M   600000000
 #define S550M   550000000
 #define S500M   500000000
+#define S300M   300000000
 #define S250M   250000000
 #define S125M   125000000
 
 /* DSP speeds */
+#define S875M   875000000
+#define S660M   660000000
+#define S520M   520000000
 #define S430M   430000000
 #define S400M   400000000
 #define S360M   360000000
+#define S260M   260000000
 #define S180M   180000000
 #define S90M    90000000
 
 /* L3 speeds */
 #define S83M    83000000
+#define S100M   100000000
 #define S166M   166000000
+#define S200M   200000000
 
 extern struct omap_opp *omap3_mpu_rate_table;
 extern struct omap_opp *omap3_dsp_rate_table;
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 14131f8..86137bb 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -141,6 +141,41 @@ static __initdata struct omap_opp 
omap34xx_dsp_rate_table[] = {
        {0, 0, 0, 0},
 };
 
+static __initdata struct omap_opp omap36xx_mpu_rate_table[] = {
+       {0, 0, 0, 0},
+       /*OPP1 - 930mV - OPP50*/
+       {true, S300M, VDD1_OPP1, 0x1a},
+       /*OPP2 - 1.100V - OPP100*/
+       {true, S600M, VDD1_OPP2, 0x28},
+       /*OPP3 - 1.260V - OPP-Turbo*/
+       {false, S800M, VDD1_OPP3, 0x34},
+       /*OPP4 - 1.310V - OPP-SB*/
+       {false, S1000M, VDD1_OPP4, 0x38},
+       {0, 0, 0, 0},
+};
+
+static __initdata struct omap_opp omap36xx_l3_rate_table[] = {
+       {0, 0, 0, 0},
+       /*OPP1 - 930mV - OPP50 */
+       {true, S100M, VDD2_OPP1, 0x1a},
+       /*OPP2 - 1.375V - OPP100, OPP-Turbo, OPP-SB*/
+       {true, S200M, VDD2_OPP2, 0x2b},
+       {0, 0, 0, 0},
+};
+
+static __initdata struct omap_opp omap36xx_dsp_rate_table[] = {
+       {0, 0, 0, 0},
+       /*OPP1 - OPP50*/
+       {true, S260M, VDD1_OPP1, 0x1a},
+       /*OPP2 - OPP100*/
+       {true, S520M, VDD1_OPP2, 0x28},
+       /*OPP3 - OPP-Turbo*/
+       {false, S660M, VDD1_OPP3, 0x34},
+       /*OPP4 - OPP-SB*/
+       {false, S875M, VDD1_OPP4, 0x38},
+       {0, 0, 0, 0},
+};
+
 struct omap_opp *omap3_mpu_rate_table;
 struct omap_opp *omap3_dsp_rate_table;
 struct omap_opp *omap3_l3_rate_table;
@@ -1287,22 +1322,42 @@ static void __init configure_vc(void)
 void __init omap3_pm_init_opp_table(void)
 {
        /* Populate the base CPU rate tables here */
-       omap3_mpu_rate_table = kmalloc(sizeof(omap34xx_mpu_rate_table),
-                       GFP_KERNEL);
-       omap3_dsp_rate_table = kmalloc(sizeof(omap34xx_dsp_rate_table),
-                       GFP_KERNEL);
-       omap3_l3_rate_table = kmalloc(sizeof(omap34xx_l3_rate_table),
-                       GFP_KERNEL);
-
-       BUG_ON(!omap3_mpu_rate_table || !omap3_dsp_rate_table ||
-               !omap3_l3_rate_table);
-
-       memcpy(omap3_mpu_rate_table, omap34xx_mpu_rate_table,
-                       sizeof(omap34xx_mpu_rate_table));
-       memcpy(omap3_dsp_rate_table, omap34xx_dsp_rate_table,
-                       sizeof(omap34xx_dsp_rate_table));
-       memcpy(omap3_l3_rate_table, omap34xx_l3_rate_table,
-                       sizeof(omap34xx_l3_rate_table));
+       if (cpu_is_omap3630()) {
+               omap3_mpu_rate_table = kmalloc(sizeof(omap36xx_mpu_rate_table),
+                               GFP_KERNEL);
+               omap3_dsp_rate_table = kmalloc(sizeof(omap36xx_dsp_rate_table),
+                               GFP_KERNEL);
+               omap3_l3_rate_table = kmalloc(sizeof(omap36xx_l3_rate_table),
+                               GFP_KERNEL);
+
+               BUG_ON(!omap3_mpu_rate_table || !omap3_dsp_rate_table ||
+                       !omap3_l3_rate_table);
+
+               memcpy(omap3_mpu_rate_table, omap36xx_mpu_rate_table,
+                               sizeof(omap36xx_mpu_rate_table));
+               memcpy(omap3_dsp_rate_table, omap36xx_dsp_rate_table,
+                               sizeof(omap36xx_dsp_rate_table));
+               memcpy(omap3_l3_rate_table, omap36xx_l3_rate_table,
+                               sizeof(omap36xx_l3_rate_table));
+       } else {
+               /* Default to 34xx devices */
+               omap3_mpu_rate_table = kmalloc(sizeof(omap34xx_mpu_rate_table),
+                               GFP_KERNEL);
+               omap3_dsp_rate_table = kmalloc(sizeof(omap34xx_dsp_rate_table),
+                               GFP_KERNEL);
+               omap3_l3_rate_table = kmalloc(sizeof(omap34xx_l3_rate_table),
+                               GFP_KERNEL);
+
+               BUG_ON(!omap3_mpu_rate_table || !omap3_dsp_rate_table ||
+                       !omap3_l3_rate_table);
+
+               memcpy(omap3_mpu_rate_table, omap34xx_mpu_rate_table,
+                               sizeof(omap34xx_mpu_rate_table));
+               memcpy(omap3_dsp_rate_table, omap34xx_dsp_rate_table,
+                               sizeof(omap34xx_dsp_rate_table));
+               memcpy(omap3_l3_rate_table, omap34xx_l3_rate_table,
+                               sizeof(omap34xx_l3_rate_table));
+       }
 }
 
 static int __init omap3_pm_early_init(void)
-- 
1.6.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to