Merge branch 'sh-latest' of git://github.com/pmundt/linux-sh
[pandora-kernel.git] / arch / arm / mach-omap2 / omap_twl.c
index 07d6140..f515a1a 100644 (file)
 
 #define OMAP4_SRI2C_SLAVE_ADDR         0x12
 #define OMAP4_VDD_MPU_SR_VOLT_REG      0x55
+#define OMAP4_VDD_MPU_SR_CMD_REG       0x56
 #define OMAP4_VDD_IVA_SR_VOLT_REG      0x5B
+#define OMAP4_VDD_IVA_SR_CMD_REG       0x5C
 #define OMAP4_VDD_CORE_SR_VOLT_REG     0x61
+#define OMAP4_VDD_CORE_SR_CMD_REG      0x62
 
 #define OMAP4_VP_CONFIG_ERROROFFSET    0x00
 #define OMAP4_VP_VSTEPMIN_VSTEPMIN     0x01
@@ -95,6 +98,8 @@ static unsigned long twl6030_vsel_to_uv(const u8 vsel)
                is_offset_valid = true;
        }
 
+       if (!vsel)
+               return 0;
        /*
         * There is no specific formula for voltage to vsel
         * conversion above 1.3V. There are special hardcoded
@@ -106,9 +111,9 @@ static unsigned long twl6030_vsel_to_uv(const u8 vsel)
                return 1350000;
 
        if (smps_offset & 0x8)
-               return ((((vsel - 1) * 125) + 7000)) * 100;
+               return ((((vsel - 1) * 1266) + 70900)) * 10;
        else
-               return ((((vsel - 1) * 125) + 6000)) * 100;
+               return ((((vsel - 1) * 1266) + 60770)) * 10;
 }
 
 static u8 twl6030_uv_to_vsel(unsigned long uv)
@@ -127,6 +132,8 @@ static u8 twl6030_uv_to_vsel(unsigned long uv)
                is_offset_valid = true;
        }
 
+       if (!uv)
+               return 0x00;
        /*
         * There is no specific formula for voltage to vsel
         * conversion above 1.3V. There are special hardcoded
@@ -134,16 +141,21 @@ static u8 twl6030_uv_to_vsel(unsigned long uv)
         * hardcoding only for 1.35 V which is used for 1GH OPP for
         * OMAP4430.
         */
-       if (uv == 1350000)
+       if (uv > twl6030_vsel_to_uv(0x39)) {
+               if (uv == 1350000)
+                       return 0x3A;
+               pr_err("%s:OUT OF RANGE! non mapped vsel for %ld Vs max %ld\n",
+                       __func__, uv, twl6030_vsel_to_uv(0x39));
                return 0x3A;
+       }
 
        if (smps_offset & 0x8)
-               return DIV_ROUND_UP(uv - 700000, 12500) + 1;
+               return DIV_ROUND_UP(uv - 709000, 12660) + 1;
        else
-               return DIV_ROUND_UP(uv - 600000, 12500) + 1;
+               return DIV_ROUND_UP(uv - 607700, 12660) + 1;
 }
 
-static struct omap_volt_pmic_info omap3_mpu_volt_info = {
+static struct omap_voltdm_pmic omap3_mpu_pmic = {
        .slew_rate              = 4000,
        .step_size              = 12500,
        .on_volt                = 1200000,
@@ -158,12 +170,13 @@ static struct omap_volt_pmic_info omap3_mpu_volt_info = {
        .vp_vddmax              = OMAP3430_VP1_VLIMITTO_VDDMAX,
        .vp_timeout_us          = OMAP3_VP_VLIMITTO_TIMEOUT_US,
        .i2c_slave_addr         = OMAP3_SRI2C_SLAVE_ADDR,
-       .pmic_reg               = OMAP3_VDD_MPU_SR_CONTROL_REG,
+       .volt_reg_addr          = OMAP3_VDD_MPU_SR_CONTROL_REG,
+       .i2c_high_speed         = true,
        .vsel_to_uv             = twl4030_vsel_to_uv,
        .uv_to_vsel             = twl4030_uv_to_vsel,
 };
 
-static struct omap_volt_pmic_info omap3_core_volt_info = {
+static struct omap_voltdm_pmic omap3_core_pmic = {
        .slew_rate              = 4000,
        .step_size              = 12500,
        .on_volt                = 1200000,
@@ -178,18 +191,19 @@ static struct omap_volt_pmic_info omap3_core_volt_info = {
        .vp_vddmax              = OMAP3430_VP2_VLIMITTO_VDDMAX,
        .vp_timeout_us          = OMAP3_VP_VLIMITTO_TIMEOUT_US,
        .i2c_slave_addr         = OMAP3_SRI2C_SLAVE_ADDR,
-       .pmic_reg               = OMAP3_VDD_CORE_SR_CONTROL_REG,
+       .volt_reg_addr          = OMAP3_VDD_CORE_SR_CONTROL_REG,
+       .i2c_high_speed         = true,
        .vsel_to_uv             = twl4030_vsel_to_uv,
        .uv_to_vsel             = twl4030_uv_to_vsel,
 };
 
-static struct omap_volt_pmic_info omap4_mpu_volt_info = {
+static struct omap_voltdm_pmic omap4_mpu_pmic = {
        .slew_rate              = 4000,
-       .step_size              = 12500,
-       .on_volt                = 1350000,
-       .onlp_volt              = 1350000,
-       .ret_volt               = 837500,
-       .off_volt               = 600000,
+       .step_size              = 12660,
+       .on_volt                = 1375000,
+       .onlp_volt              = 1375000,
+       .ret_volt               = 830000,
+       .off_volt               = 0,
        .volt_setup_time        = 0,
        .vp_erroroffset         = OMAP4_VP_CONFIG_ERROROFFSET,
        .vp_vstepmin            = OMAP4_VP_VSTEPMIN_VSTEPMIN,
@@ -198,18 +212,20 @@ static struct omap_volt_pmic_info omap4_mpu_volt_info = {
        .vp_vddmax              = OMAP4_VP_MPU_VLIMITTO_VDDMAX,
        .vp_timeout_us          = OMAP4_VP_VLIMITTO_TIMEOUT_US,
        .i2c_slave_addr         = OMAP4_SRI2C_SLAVE_ADDR,
-       .pmic_reg               = OMAP4_VDD_MPU_SR_VOLT_REG,
+       .volt_reg_addr          = OMAP4_VDD_MPU_SR_VOLT_REG,
+       .cmd_reg_addr           = OMAP4_VDD_MPU_SR_CMD_REG,
+       .i2c_high_speed         = true,
        .vsel_to_uv             = twl6030_vsel_to_uv,
        .uv_to_vsel             = twl6030_uv_to_vsel,
 };
 
-static struct omap_volt_pmic_info omap4_iva_volt_info = {
+static struct omap_voltdm_pmic omap4_iva_pmic = {
        .slew_rate              = 4000,
-       .step_size              = 12500,
-       .on_volt                = 1100000,
-       .onlp_volt              = 1100000,
-       .ret_volt               = 837500,
-       .off_volt               = 600000,
+       .step_size              = 12660,
+       .on_volt                = 1188000,
+       .onlp_volt              = 1188000,
+       .ret_volt               = 830000,
+       .off_volt               = 0,
        .volt_setup_time        = 0,
        .vp_erroroffset         = OMAP4_VP_CONFIG_ERROROFFSET,
        .vp_vstepmin            = OMAP4_VP_VSTEPMIN_VSTEPMIN,
@@ -218,18 +234,20 @@ static struct omap_volt_pmic_info omap4_iva_volt_info = {
        .vp_vddmax              = OMAP4_VP_IVA_VLIMITTO_VDDMAX,
        .vp_timeout_us          = OMAP4_VP_VLIMITTO_TIMEOUT_US,
        .i2c_slave_addr         = OMAP4_SRI2C_SLAVE_ADDR,
-       .pmic_reg               = OMAP4_VDD_IVA_SR_VOLT_REG,
+       .volt_reg_addr          = OMAP4_VDD_IVA_SR_VOLT_REG,
+       .cmd_reg_addr           = OMAP4_VDD_IVA_SR_CMD_REG,
+       .i2c_high_speed         = true,
        .vsel_to_uv             = twl6030_vsel_to_uv,
        .uv_to_vsel             = twl6030_uv_to_vsel,
 };
 
-static struct omap_volt_pmic_info omap4_core_volt_info = {
+static struct omap_voltdm_pmic omap4_core_pmic = {
        .slew_rate              = 4000,
-       .step_size              = 12500,
-       .on_volt                = 1100000,
-       .onlp_volt              = 1100000,
-       .ret_volt               = 837500,
-       .off_volt               = 600000,
+       .step_size              = 12660,
+       .on_volt                = 1200000,
+       .onlp_volt              = 1200000,
+       .ret_volt               = 830000,
+       .off_volt               = 0,
        .volt_setup_time        = 0,
        .vp_erroroffset         = OMAP4_VP_CONFIG_ERROROFFSET,
        .vp_vstepmin            = OMAP4_VP_VSTEPMIN_VSTEPMIN,
@@ -238,7 +256,8 @@ static struct omap_volt_pmic_info omap4_core_volt_info = {
        .vp_vddmax              = OMAP4_VP_CORE_VLIMITTO_VDDMAX,
        .vp_timeout_us          = OMAP4_VP_VLIMITTO_TIMEOUT_US,
        .i2c_slave_addr         = OMAP4_SRI2C_SLAVE_ADDR,
-       .pmic_reg               = OMAP4_VDD_CORE_SR_VOLT_REG,
+       .volt_reg_addr          = OMAP4_VDD_CORE_SR_VOLT_REG,
+       .cmd_reg_addr           = OMAP4_VDD_CORE_SR_CMD_REG,
        .vsel_to_uv             = twl6030_vsel_to_uv,
        .uv_to_vsel             = twl6030_uv_to_vsel,
 };
@@ -250,14 +269,14 @@ int __init omap4_twl_init(void)
        if (!cpu_is_omap44xx())
                return -ENODEV;
 
-       voltdm = omap_voltage_domain_lookup("mpu");
-       omap_voltage_register_pmic(voltdm, &omap4_mpu_volt_info);
+       voltdm = voltdm_lookup("mpu");
+       omap_voltage_register_pmic(voltdm, &omap4_mpu_pmic);
 
-       voltdm = omap_voltage_domain_lookup("iva");
-       omap_voltage_register_pmic(voltdm, &omap4_iva_volt_info);
+       voltdm = voltdm_lookup("iva");
+       omap_voltage_register_pmic(voltdm, &omap4_iva_pmic);
 
-       voltdm = omap_voltage_domain_lookup("core");
-       omap_voltage_register_pmic(voltdm, &omap4_core_volt_info);
+       voltdm = voltdm_lookup("core");
+       omap_voltage_register_pmic(voltdm, &omap4_core_pmic);
 
        return 0;
 }
@@ -270,10 +289,10 @@ int __init omap3_twl_init(void)
                return -ENODEV;
 
        if (cpu_is_omap3630()) {
-               omap3_mpu_volt_info.vp_vddmin = OMAP3630_VP1_VLIMITTO_VDDMIN;
-               omap3_mpu_volt_info.vp_vddmax = OMAP3630_VP1_VLIMITTO_VDDMAX;
-               omap3_core_volt_info.vp_vddmin = OMAP3630_VP2_VLIMITTO_VDDMIN;
-               omap3_core_volt_info.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX;
+               omap3_mpu_pmic.vp_vddmin = OMAP3630_VP1_VLIMITTO_VDDMIN;
+               omap3_mpu_pmic.vp_vddmax = OMAP3630_VP1_VLIMITTO_VDDMAX;
+               omap3_core_pmic.vp_vddmin = OMAP3630_VP2_VLIMITTO_VDDMIN;
+               omap3_core_pmic.vp_vddmax = OMAP3630_VP2_VLIMITTO_VDDMAX;
        }
 
        /*
@@ -288,11 +307,11 @@ int __init omap3_twl_init(void)
        if (!twl_sr_enable_autoinit)
                omap3_twl_set_sr_bit(true);
 
-       voltdm = omap_voltage_domain_lookup("mpu");
-       omap_voltage_register_pmic(voltdm, &omap3_mpu_volt_info);
+       voltdm = voltdm_lookup("mpu_iva");
+       omap_voltage_register_pmic(voltdm, &omap3_mpu_pmic);
 
-       voltdm = omap_voltage_domain_lookup("core");
-       omap_voltage_register_pmic(voltdm, &omap3_core_volt_info);
+       voltdm = voltdm_lookup("core");
+       omap_voltage_register_pmic(voltdm, &omap3_core_pmic);
 
        return 0;
 }