aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhou Jingyu <b02241@freescale.com>2011-01-26 16:16:31 +0800
committerZhou Jingyu <b02241@freescale.com>2011-01-26 16:59:36 +0800
commitdfe82b8fde09a2e8d45b3724124b546ce32540e0 (patch)
treecb5f43bc477810ddff324cb00ad2049a39280307
parenta9d547c7b51574323784b0f80d383eab62a16769 (diff)
ENGR00138528 MX53 loco&smd:preset suspend voltage in the latest stage
MX53 loco&smd:preset suspend voltage in the latest stage because Da9053 use the same register for preset and normal mode Signed-off-by: Zhou Jingyu <Jingyu.Zhou@freescale.com>
-rw-r--r--arch/arm/mach-mx5/mx53_loco_pmic_da9053.c3
-rw-r--r--arch/arm/mach-mx5/mx53_smd_pmic_da9053.c4
-rw-r--r--arch/arm/mach-mx5/pm.c11
-rw-r--r--arch/arm/mach-mx5/pm_da9053.c40
4 files changed, 46 insertions, 12 deletions
diff --git a/arch/arm/mach-mx5/mx53_loco_pmic_da9053.c b/arch/arm/mach-mx5/mx53_loco_pmic_da9053.c
index 1a833d89e788..e11243b67043 100644
--- a/arch/arm/mach-mx5/mx53_loco_pmic_da9053.c
+++ b/arch/arm/mach-mx5/mx53_loco_pmic_da9053.c
@@ -54,6 +54,9 @@
},\
}
+/* currently the suspend_mv here takes no effects for DA9053
+preset-voltage have to be done in the latest stage during
+suspend*/
static struct regulator_init_data da9052_regulators_init[] = {
DA9052_LDO(DA9052_LDO1_VOLT_UPPER,
DA9052_LDO1_VOLT_LOWER, "DA9052_LDO1", 1300),
diff --git a/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c b/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c
index 6179e8e1e9ce..e6cf9e380f30 100644
--- a/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c
+++ b/arch/arm/mach-mx5/mx53_smd_pmic_da9053.c
@@ -56,6 +56,9 @@
},\
}
+/* currently the suspend_mv field here takes no effects for DA9053
+preset-voltage have to be done in the latest stage during
+suspend*/
static struct regulator_init_data da9052_regulators_init[] = {
DA9052_LDO(DA9052_LDO1_VOLT_UPPER,
DA9052_LDO1_VOLT_LOWER, "DA9052_LDO1", 1300),
@@ -268,7 +271,6 @@ static int __init smd_da9052_init(struct da9052 *da9052)
da9052_init_ssc_cache(da9052);
ret = platform_device_register(&wifi_bt_reg_device);
- pr_info("%s ret=%d\n", __func__);
return 0;
}
diff --git a/arch/arm/mach-mx5/pm.c b/arch/arm/mach-mx5/pm.c
index 0542d83a5f2c..f07681be3748 100644
--- a/arch/arm/mach-mx5/pm.c
+++ b/arch/arm/mach-mx5/pm.c
@@ -144,16 +144,6 @@ static int mx5_suspend_enter(suspend_state_t state)
return 0;
}
-static int mx5_suspend_begin(suspend_state_t state)
-{
- if (machine_is_mx53_loco() ||
- machine_is_mx53_smd()) {
- if (PM_SUSPEND_MEM == state)
- regulator_suspend_prepare(
- PM_SUSPEND_MEM);
- }
- return 0;
-}
/*
* Called after processes are frozen, but before we shut down devices.
@@ -226,7 +216,6 @@ static int mx5_pm_valid(suspend_state_t state)
struct platform_suspend_ops mx5_suspend_ops = {
.valid = mx5_pm_valid,
- .begin = mx5_suspend_begin,
.prepare = mx5_suspend_prepare,
.enter = mx5_suspend_enter,
.finish = mx5_suspend_finish,
diff --git a/arch/arm/mach-mx5/pm_da9053.c b/arch/arm/mach-mx5/pm_da9053.c
index 319013597f22..6e24fb2823d4 100644
--- a/arch/arm/mach-mx5/pm_da9053.c
+++ b/arch/arm/mach-mx5/pm_da9053.c
@@ -290,6 +290,35 @@ void pm_da9053_write_reg(u8 reg, u8 value)
pm_i2c_imx_xfer(i2cmsg, 1);
}
+/* have to hard-code the preset voltage here for they share the register
+as the normal setting on Da9053 */
+/* preset buck core to 850 mv */
+#define BUCKCORE_SUSPEND_PRESET 0xCE
+/* preset buck core to 950 mv */
+#define BUCKPRO_SUSPEND_PRESET 0xD2
+/* preset ldo6 to 1200 mv */
+#define LDO6_SUSPEND_PRESET 0xC0
+/* preset ldo10 to 1200 mv */
+#define iLDO10_SUSPEND_PRESET 0xC0
+#define CONF_BIT 0x80
+
+static u8 volt_settings[DA9052_LDO10_REG - DA9052_BUCKCORE_REG + 1];
+static void pm_da9053_preset_voltage(void)
+{
+ u8 reg, data;
+ for (reg = DA9052_BUCKCORE_REG;
+ reg <= DA9052_LDO10_REG; reg++) {
+ pm_da9053_read_reg(reg, &data);
+ volt_settings[reg - DA9052_BUCKCORE_REG] = data;
+ data |= CONF_BIT;
+ pm_da9053_write_reg(reg, data);
+ }
+ pm_da9053_write_reg(DA9052_BUCKCORE_REG, BUCKCORE_SUSPEND_PRESET);
+ pm_da9053_write_reg(DA9052_BUCKPRO_REG, BUCKPRO_SUSPEND_PRESET);
+ pm_da9053_write_reg(DA9052_LDO6_REG, LDO6_SUSPEND_PRESET);
+ pm_da9053_write_reg(DA9052_LDO10_REG, iLDO10_SUSPEND_PRESET);
+}
+
#define DA9053_SLEEP_DELAY 0x1f
int da9053_suspend_cmd(void)
{
@@ -305,6 +334,8 @@ int da9053_suspend_cmd(void)
}
clk_enable(i2c_clk);
+ pm_da9053_preset_voltage();
+
pm_da9053_read_reg(DA9052_ID01_REG, &data);
data &= ~(DA9052_ID01_DEFSUPPLY | DA9052_ID01_nRESMODE);
pm_da9053_write_reg(DA9052_ID01_REG, data);
@@ -320,6 +351,15 @@ int da9053_suspend_cmd(void)
return 0;
}
+void da9053_restore_volt_settings(void)
+{
+ u8 reg;
+ for (reg = DA9052_BUCKCORE_REG;
+ reg <= DA9052_LDO10_REG; reg++)
+ pm_da9053_write_reg(reg,
+ volt_settings[reg - DA9052_BUCKCORE_REG]);
+}
+
int da9053_poweroff_cmd(void)
{
unsigned char buf[2] = {0, 0};