ARM: OMAP3+: PM: VP: use uV for max and min voltage limits
authorNishanth Menon <nm@ti.com>
Tue, 25 Sep 2012 16:33:33 +0000 (19:33 +0300)
committerKevin Hilman <khilman@ti.com>
Mon, 5 Nov 2012 23:03:34 +0000 (15:03 -0800)
Every PMIC has it's own eccentricities, For example, one of the
PMIC has MSB set to 1 for a specific function - voltage enable!
using an hardcoded value specific for TWL when copied over to
such an implementation causes the system to crash as the MSB bit
was 0 and the voltage got disabled!.

Instead we use actual values and depend on the convertion routines
to abstract out the eccentricities of each PMIC.

With this, we can now move the voltages to a common location in
voltage.h as they are no longer dependent on PMICs and expect the
PMIC's conversion routines to set a cap if the voltage is out of
reach for the PMIC.

Reported-by: Jon Hunter <jon-hunter@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Vishwanath BS <vishwanath.bs@ti.com>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
arch/arm/mach-omap2/omap_twl.c
arch/arm/mach-omap2/voltage.h
arch/arm/mach-omap2/vp.c

index f515a1a056d55c96facdb49c9eec0911d8f6c728..df4e7c38f7c6683e65a35781a9484fe3af0dfe5c 100644 (file)
 #define OMAP3_VP_VSTEPMAX_VSTEPMAX     0x04
 #define OMAP3_VP_VLIMITTO_TIMEOUT_US   200
 
-#define OMAP3430_VP1_VLIMITTO_VDDMIN   0x14
-#define OMAP3430_VP1_VLIMITTO_VDDMAX   0x42
-#define OMAP3430_VP2_VLIMITTO_VDDMIN   0x18
-#define OMAP3430_VP2_VLIMITTO_VDDMAX   0x2c
-
-#define OMAP3630_VP1_VLIMITTO_VDDMIN   0x18
-#define OMAP3630_VP1_VLIMITTO_VDDMAX   0x3c
-#define OMAP3630_VP2_VLIMITTO_VDDMIN   0x18
-#define OMAP3630_VP2_VLIMITTO_VDDMAX   0x30
-
 #define OMAP4_SRI2C_SLAVE_ADDR         0x12
 #define OMAP4_VDD_MPU_SR_VOLT_REG      0x55
 #define OMAP4_VDD_MPU_SR_CMD_REG       0x56
 #define OMAP4_VP_VSTEPMAX_VSTEPMAX     0x04
 #define OMAP4_VP_VLIMITTO_TIMEOUT_US   200
 
-#define OMAP4_VP_MPU_VLIMITTO_VDDMIN   0xA
-#define OMAP4_VP_MPU_VLIMITTO_VDDMAX   0x39
-#define OMAP4_VP_IVA_VLIMITTO_VDDMIN   0xA
-#define OMAP4_VP_IVA_VLIMITTO_VDDMAX   0x2D
-#define OMAP4_VP_CORE_VLIMITTO_VDDMIN  0xA
-#define OMAP4_VP_CORE_VLIMITTO_VDDMAX  0x28
-
 static bool is_offset_valid;
 static u8 smps_offset;
 /*
index 7283b7ed7de84ace8a84d66d0436d317805d81ee..700469561b4d1d75b8b9cc9129520edf8d64576e 100644 (file)
@@ -92,6 +92,24 @@ struct voltagedomain {
        struct omap_volt_data *volt_data;
 };
 
+/* Min and max voltages from OMAP perspective */
+#define OMAP3430_VP1_VLIMITTO_VDDMIN   850000
+#define OMAP3430_VP1_VLIMITTO_VDDMAX   1425000
+#define OMAP3430_VP2_VLIMITTO_VDDMIN   900000
+#define OMAP3430_VP2_VLIMITTO_VDDMAX   1150000
+
+#define OMAP3630_VP1_VLIMITTO_VDDMIN   900000
+#define OMAP3630_VP1_VLIMITTO_VDDMAX   1350000
+#define OMAP3630_VP2_VLIMITTO_VDDMIN   900000
+#define OMAP3630_VP2_VLIMITTO_VDDMAX   1200000
+
+#define OMAP4_VP_MPU_VLIMITTO_VDDMIN   830000
+#define OMAP4_VP_MPU_VLIMITTO_VDDMAX   1410000
+#define OMAP4_VP_IVA_VLIMITTO_VDDMIN   830000
+#define OMAP4_VP_IVA_VLIMITTO_VDDMAX   1260000
+#define OMAP4_VP_CORE_VLIMITTO_VDDMIN  830000
+#define OMAP4_VP_CORE_VLIMITTO_VDDMAX  1200000
+
 /**
  * struct omap_voltdm_pmic - PMIC specific data required by voltage driver.
  * @slew_rate: PMIC slew rate (in uv/us)
@@ -118,8 +136,8 @@ struct omap_voltdm_pmic {
        u8 vp_erroroffset;
        u8 vp_vstepmin;
        u8 vp_vstepmax;
-       u8 vp_vddmin;
-       u8 vp_vddmax;
+       u32 vp_vddmin;
+       u32 vp_vddmax;
        u8 vp_timeout_us;
        bool i2c_high_speed;
        u8 i2c_mcode;
index 85241b828c029e45b2f494925af3a3296cd92982..47c89eba57cae664fcb1474d2d05f31aead74a85 100644 (file)
@@ -58,8 +58,8 @@ void __init omap_vp_init(struct voltagedomain *voltdm)
        sys_clk_rate = voltdm->sys_clk.rate / 1000;
 
        timeout = (sys_clk_rate * voltdm->pmic->vp_timeout_us) / 1000;
-       vddmin = voltdm->pmic->vp_vddmin;
-       vddmax = voltdm->pmic->vp_vddmax;
+       vddmin = voltdm->pmic->uv_to_vsel(voltdm->pmic->vp_vddmin);
+       vddmax = voltdm->pmic->uv_to_vsel(voltdm->pmic->vp_vddmax);
 
        waittime = DIV_ROUND_UP(voltdm->pmic->step_size * sys_clk_rate,
                                1000 * voltdm->pmic->slew_rate);