Commit c145649b authored by Tony Lindgren's avatar Tony Lindgren

ARM: OMAP2+: Configure voltage controller for cpcap to low-speed

Looks like the i2c timings in high-speed mode do not work properly to
allow us to clear I2C_DISABLE bits for PRM_VOLTCTRL register and the
device reboots if I2C_DISABLE bits are cleared.

Let's configure the voltage controller i2c for low-speed mode as done in
the Motorola Mapphone Android Linux kernel. This saves us about 7mW of
power during retention compared to the high-speed values.

Let's also change the low-speed warning to pr_info about relying on the
bootloader configured low-speed values like we currently do.

Cc: Merlijn Wajer <merlijn@wizzup.org>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Sebastian Reichel <sre@kernel.org>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 71065d3f
...@@ -61,7 +61,7 @@ static struct omap_voltdm_pmic omap_cpcap_core = { ...@@ -61,7 +61,7 @@ static struct omap_voltdm_pmic omap_cpcap_core = {
.i2c_slave_addr = 0x02, .i2c_slave_addr = 0x02,
.volt_reg_addr = 0x00, .volt_reg_addr = 0x00,
.cmd_reg_addr = 0x01, .cmd_reg_addr = 0x01,
.i2c_high_speed = true, .i2c_high_speed = false,
.vsel_to_uv = omap_cpcap_vsel_to_uv, .vsel_to_uv = omap_cpcap_vsel_to_uv,
.uv_to_vsel = omap_cpcap_uv_to_vsel, .uv_to_vsel = omap_cpcap_uv_to_vsel,
}; };
...@@ -78,7 +78,7 @@ static struct omap_voltdm_pmic omap_cpcap_iva = { ...@@ -78,7 +78,7 @@ static struct omap_voltdm_pmic omap_cpcap_iva = {
.i2c_slave_addr = 0x44, .i2c_slave_addr = 0x44,
.volt_reg_addr = 0x0, .volt_reg_addr = 0x0,
.cmd_reg_addr = 0x01, .cmd_reg_addr = 0x01,
.i2c_high_speed = true, .i2c_high_speed = false,
.vsel_to_uv = omap_cpcap_vsel_to_uv, .vsel_to_uv = omap_cpcap_vsel_to_uv,
.uv_to_vsel = omap_cpcap_uv_to_vsel, .uv_to_vsel = omap_cpcap_uv_to_vsel,
}; };
...@@ -125,7 +125,7 @@ static struct omap_voltdm_pmic omap443x_max8952_mpu = { ...@@ -125,7 +125,7 @@ static struct omap_voltdm_pmic omap443x_max8952_mpu = {
.i2c_slave_addr = 0x60, .i2c_slave_addr = 0x60,
.volt_reg_addr = 0x03, .volt_reg_addr = 0x03,
.cmd_reg_addr = 0x03, .cmd_reg_addr = 0x03,
.i2c_high_speed = true, .i2c_high_speed = false,
.vsel_to_uv = omap_max8952_vsel_to_uv, .vsel_to_uv = omap_max8952_vsel_to_uv,
.uv_to_vsel = omap_max8952_uv_to_vsel, .uv_to_vsel = omap_max8952_uv_to_vsel,
}; };
...@@ -212,7 +212,7 @@ static struct omap_voltdm_pmic omap4_fan_core = { ...@@ -212,7 +212,7 @@ static struct omap_voltdm_pmic omap4_fan_core = {
.vddmax = 1375000, .vddmax = 1375000,
.vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US, .vp_timeout_us = OMAP4_VP_VLIMITTO_TIMEOUT_US,
.i2c_slave_addr = 0x4A, .i2c_slave_addr = 0x4A,
.i2c_high_speed = true, .i2c_high_speed = false,
.volt_reg_addr = 0x01, .volt_reg_addr = 0x01,
.cmd_reg_addr = 0x01, .cmd_reg_addr = 0x01,
.vsel_to_uv = omap_fan535508_vsel_to_uv, .vsel_to_uv = omap_fan535508_vsel_to_uv,
...@@ -232,7 +232,7 @@ static struct omap_voltdm_pmic omap4_fan_iva = { ...@@ -232,7 +232,7 @@ static struct omap_voltdm_pmic omap4_fan_iva = {
.i2c_slave_addr = 0x48, .i2c_slave_addr = 0x48,
.volt_reg_addr = 0x01, .volt_reg_addr = 0x01,
.cmd_reg_addr = 0x01, .cmd_reg_addr = 0x01,
.i2c_high_speed = true, .i2c_high_speed = false,
.vsel_to_uv = omap_fan535503_vsel_to_uv, .vsel_to_uv = omap_fan535503_vsel_to_uv,
.uv_to_vsel = omap_fan535503_uv_to_vsel, .uv_to_vsel = omap_fan535503_uv_to_vsel,
}; };
...@@ -263,3 +263,11 @@ int __init omap4_cpcap_init(void) ...@@ -263,3 +263,11 @@ int __init omap4_cpcap_init(void)
return 0; return 0;
} }
static int __init cpcap_late_init(void)
{
omap4_vc_set_pmic_signaling(PWRDM_POWER_RET);
return 0;
}
omap_late_initcall(cpcap_late_init);
...@@ -670,7 +670,7 @@ static void __init omap4_vc_i2c_timing_init(struct voltagedomain *voltdm) ...@@ -670,7 +670,7 @@ static void __init omap4_vc_i2c_timing_init(struct voltagedomain *voltdm)
const struct i2c_init_data *i2c_data; const struct i2c_init_data *i2c_data;
if (!voltdm->pmic->i2c_high_speed) { if (!voltdm->pmic->i2c_high_speed) {
pr_warn("%s: only high speed supported!\n", __func__); pr_info("%s: using bootloader low-speed timings\n", __func__);
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment