pm2: Power Management driver changes for 8x25
Current pm2.c driver supports low power mode functionality
only for single APPS processor targets. This patch adds extra
functionality to pm2.c driver to support multicore APPS
processor targets where MODEM is a master.
These changes makes pm2.c driver backward compatible to
older targets(eg: 7x27a & 7x30 etc) & multicore APPS
processors like 8x25.
Change-Id: I79b23b2a2052aa55f9a169886dea17180614dedb
Signed-off-by: Murali Nalajala <mnalajal@codeaurora.org>
diff --git a/arch/arm/mach-msm/pm-boot.c b/arch/arm/mach-msm/pm-boot.c
index ce09f9f..f4536f7 100644
--- a/arch/arm/mach-msm/pm-boot.c
+++ b/arch/arm/mach-msm/pm-boot.c
@@ -101,6 +101,7 @@
int __init msm_pm_boot_init(struct msm_pm_boot_platform_data *pdata)
{
int ret = 0;
+ unsigned long entry;
switch (pdata->mode) {
case MSM_PM_BOOT_CONFIG_TZ:
@@ -130,15 +131,44 @@
if (!pdata->p_addr || !pdata->v_addr)
return -ENODEV;
- __raw_writel((pdata->p_addr | BOOT_REMAP_ENABLE),
- pdata->v_addr);
-
ret = msm_pm_boot_reset_vector_init(__va(pdata->p_addr));
- msm_pm_boot_before_pc
- = msm_pm_config_rst_vector_before_pc;
- msm_pm_boot_after_pc
- = msm_pm_config_rst_vector_after_pc;
+ if (!cpu_is_msm8625()) {
+ __raw_writel((pdata->p_addr | BOOT_REMAP_ENABLE),
+ pdata->v_addr);
+
+ msm_pm_boot_before_pc
+ = msm_pm_config_rst_vector_before_pc;
+ msm_pm_boot_after_pc
+ = msm_pm_config_rst_vector_after_pc;
+ } else {
+ entry = virt_to_phys(msm_pm_boot_entry);
+
+ msm_pm_reset_vector[0] = 0xE51FF004; /* ldr pc, 4 */
+ msm_pm_reset_vector[1] = entry;
+
+ /* Here upper 16bits[16:31] used by CORE1
+ * lower 16bits[0:15] used by CORE0
+ */
+ entry = (pdata->p_addr) |
+ ((pdata->p_addr & 0xFFFF0000) >> 16);
+
+ /* write 'entry' to boot remapper register */
+ __raw_writel(entry, (pdata->v_addr +
+ MPA5_BOOT_REMAP_ADDR));
+
+ /* Enable boot remapper for C0 [bit:25th] */
+ __raw_writel(readl_relaxed(pdata->v_addr +
+ MPA5_CFG_CTL_REG) | BIT(25),
+ pdata->v_addr + MPA5_CFG_CTL_REG);
+
+ /* Enable boot remapper for C1 [bit:26th] */
+ __raw_writel(readl_relaxed(pdata->v_addr +
+ MPA5_CFG_CTL_REG) | BIT(26),
+ pdata->v_addr + MPA5_CFG_CTL_REG);
+
+ msm_pm_boot_before_pc = msm_pm_write_boot_vector;
+ }
break;
default:
__WARN();