This workaround is needed because we don't have smartreflex
driver. These configurations are taken from TI's reference code.
Signed-off-by: Jouni Hogander <[EMAIL PROTECTED]>
---
arch/arm/mach-omap2/pm34xx.c | 67 ++++++++++++++++++++++++++++++++++++++
drivers/i2c/chips/twl4030-core.c | 9 +++++
2 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index e578503..49e2989 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -346,6 +346,25 @@ static struct platform_suspend_ops omap_pm_ops = {
.valid = suspend_valid_only_mem,
};
+/* PRM_VC_CMD_VAL_0 specific bits */
+#define PRM_VC_CMD_VAL0_ON 0x30
+#define PRM_VC_CMD_VAL0_ONLP 0x18
+#define PRM_VC_CMD_VAL0_RET 0x18
+#define PRM_VC_CMD_VAL0_OFF 0x18
+
+/* PRM_VC_CMD_VAL_1 specific bits */
+#define PRM_VC_CMD_VAL1_ON 0x2C
+#define PRM_VC_CMD_VAL1_ONLP 0x18
+#define PRM_VC_CMD_VAL1_RET 0x18
+#define PRM_VC_CMD_VAL1_OFF 0x18
+
+/* PRM_VOLTCTRL */
+#define PRM_VOLTCTRL_AUTO_RET 0x2
+
+/* T2 SMART REFLEX */
+#define R_SRI2C_SLAVE_ADDR 0x12
+#define R_VDD1_SR_CONTROL 0x00
+#define R_VDD2_SR_CONTROL 0x01
static void __init prcm_setup_regs(void)
{
u32 v;
@@ -360,6 +379,54 @@ static void __init prcm_setup_regs(void)
* it is selected to mpu wakeup goup */
__raw_writel(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
OMAP3430_PRM_IRQENABLE_MPU);
+
+ if (is_sil_rev_greater_than(OMAP3430_REV_ES1_0)) {
+ /* XXX These are smartreflex related and are here as long as we
+ * have working smartreflex driver in linux-omap tree */
+ __raw_writel((R_SRI2C_SLAVE_ADDR <<
+ OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT) |
+ (R_SRI2C_SLAVE_ADDR <<
+ OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT),
+ OMAP3430_PRM_VC_SMPS_SA);
+
+ __raw_writel((R_VDD2_SR_CONTROL <<
+ OMAP3430_VOLRA1_SHIFT) |
+ (R_VDD1_SR_CONTROL <<
+ OMAP3430_VOLRA0_SHIFT),
+ OMAP3430_PRM_VC_SMPS_VOL_RA);
+
+ __raw_writel((PRM_VC_CMD_VAL0_ON <<
+ OMAP3430_VC_CMD_ON_SHIFT) |
+ (PRM_VC_CMD_VAL0_ONLP <<
+ OMAP3430_VC_CMD_ONLP_SHIFT) |
+ (PRM_VC_CMD_VAL0_RET <<
+ OMAP3430_VC_CMD_RET_SHIFT) |
+ (PRM_VC_CMD_VAL0_OFF <<
+ OMAP3430_VC_CMD_OFF_SHIFT),
+ OMAP3430_PRM_VC_CMD_VAL_0);
+
+ __raw_writel((PRM_VC_CMD_VAL1_ON <<
+ OMAP3430_VC_CMD_ON_SHIFT) |
+ (PRM_VC_CMD_VAL1_ONLP <<
+ OMAP3430_VC_CMD_ONLP_SHIFT) |
+ (PRM_VC_CMD_VAL1_RET <<
+ OMAP3430_VC_CMD_RET_SHIFT) |
+ (PRM_VC_CMD_VAL1_OFF <<
+ OMAP3430_VC_CMD_OFF_SHIFT),
+ OMAP3430_PRM_VC_CMD_VAL_1);
+
+ __raw_writel(OMAP3430_CMD1 |
+ OMAP3430_RAV1,
+ OMAP3430_PRM_VC_CH_CONF);
+
+ __raw_writel(OMAP3430_MCODE_SHIFT |
+ OMAP3430_HSEN |
+ OMAP3430_SREN,
+ OMAP3430_PRM_VC_I2C_CFG);
+
+ __raw_writel(PRM_VOLTCTRL_AUTO_RET,
+ OMAP3430_PRM_VOLTCTRL);
+ }
}
static int __init pwrdms_setup(struct powerdomain *pwrdm)
diff --git a/drivers/i2c/chips/twl4030-core.c b/drivers/i2c/chips/twl4030-core.c
index 8822653..96e6216 100644
--- a/drivers/i2c/chips/twl4030-core.c
+++ b/drivers/i2c/chips/twl4030-core.c
@@ -119,6 +119,7 @@
/* Few power values */
#define R_CFG_BOOT 0x05
#define R_PROTECT_KEY 0x0E
+#define R_DCDC_GLOBAL_CFG 0x06
/* access control */
#define KEY_UNLOCK1 0xce
@@ -709,6 +710,14 @@ static int power_companion_init(void)
e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_MASTER, ctrl, R_CFG_BOOT);
e |= protect_pm_master();
+ /* XXX Enable smart reflex. Voltage scaling method should be
+ * passed in platform data */
+ e |= twl4030_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER,
+ &ctrl, R_DCDC_GLOBAL_CFG);
+ ctrl |= 0x8;
+ e |= twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
+ ctrl, R_DCDC_GLOBAL_CFG);
+
return e;
}
--
1.5.5
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html