OMAP4: scale voltage of core before MPU scales
authorNishanth Menon <nm@ti.com>
Thu, 1 Mar 2012 14:17:39 +0000 (14:17 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Tue, 15 May 2012 06:31:22 +0000 (08:31 +0200)
OMAP4 requires that parent domains scale ahead of dependent domains.
This is due to the restrictions in timing closure. To ensure
a consistent behavior across all OMAP4 SoC, ensure that
vdd_core scale first, then vdd_mpu and finally vdd_iva.

As part of doing this refactor the logic to allow for future
addition of OMAP4470 without much ado. OMAP4470 uses different
SMPS addresses and cannot be introduced in the current code
without major rewrite.

Reported-by: Isabelle Gros <i-gros@ti.com>
Reported-by: Jerome Angeloni <j-angeloni@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
arch/arm/cpu/armv7/omap4/clocks.c

index 14313129a32729ba3373666d67b4ae27a7637cc3..b6b3f7e195e5733b6d4cd9b0e4143bea22bdc574 100644 (file)
@@ -278,44 +278,51 @@ void scale_vcores(void)
        omap_vc_init(PRM_VC_I2C_CHANNEL_FREQ_KHZ);
 
        omap_rev = omap_revision();
-       /* TPS - supplies vdd_mpu on 4460 */
-       if (omap_rev >= OMAP4460_ES1_0) {
-               volt = 1203;
-               do_scale_tps62361(TPS62361_VSEL0_GPIO,
-                                 TPS62361_REG_ADDR_SET1, volt);
-       }
 
        /*
-        * VCORE 1
-        *
-        * 4430 : supplies vdd_mpu
-        * Setting a high voltage for Nitro mode as smart reflex is not enabled.
-        * We use the maximum possible value in the AVS range because the next
-        * higher voltage in the discrete range (code >= 0b111010) is way too
-        * high
-        *
-        * 4460 : supplies vdd_core
+        * Scale Voltage rails:
+        * 1. VDD_CORE
+        * 3. VDD_MPU
+        * 3. VDD_IVA
         */
        if (omap_rev < OMAP4460_ES1_0) {
+               /*
+                * OMAP4430:
+                * VDD_CORE = TWL6030 VCORE3
+                * VDD_MPU = TWL6030 VCORE1
+                * VDD_IVA = TWL6030 VCORE2
+                */
+               volt = 1200;
+               do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
+
+               /*
+                * note on VDD_MPU:
+                * Setting a high voltage for Nitro mode as smart reflex is not
+                * enabled. We use the maximum possible value in the AVS range
+                * because the next higher voltage in the discrete range
+                * (code >= 0b111010) is way too high.
+                */
                volt = 1325;
                do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
+               volt = 1200;
+               do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
+
        } else {
+               /*
+                * OMAP4460:
+                * VDD_CORE = TWL6030 VCORE1
+                * VDD_MPU = TPS62361
+                * VDD_IVA = TWL6030 VCORE2
+                */
                volt = 1200;
                do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
-       }
-
-       /* VCORE 2 - supplies vdd_iva */
-       volt = 1200;
-       do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
-
-       /*
-        * VCORE 3
-        * 4430 : supplies vdd_core
-        * 4460 : not connected
-        */
-       if (omap_rev < OMAP4460_ES1_0) {
+               /* TPS62361 */
+               volt = 1203;
+               do_scale_tps62361(TPS62361_VSEL0_GPIO,
+                                 TPS62361_REG_ADDR_SET1, volt);
+               /* VCORE 2 - supplies vdd_iva */
                volt = 1200;
-               do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
+               do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
        }
 }