msm: restart: Add support for MSM8974

Refactor the existing restart code to split out the
download mode configuration into its own function, and add
support for restarting MSM8974 targets using the new
PS_HOLD register.

Change-Id: Ibe0677d1054769c94edec390d3e7b4e5dd877b79
Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org>
This commit is contained in:
Stepan Moskovchenko 2012-08-14 21:05:14 -07:00 committed by Stephen Boyd
parent b85b2931fd
commit 7e3ce5b119
3 changed files with 36 additions and 15 deletions

View File

@ -250,6 +250,8 @@ config ARCH_MSM8974
select MSM_PIL
select MSM_SPM_V2
select MSM_L2_SPM
select MSM_NATIVE_RESTART
select MSM_RESTART_V2
select MSM_PM8X60 if PM
select MAY_HAVE_SPARSE_IRQ
select SPARSE_IRQ
@ -385,6 +387,9 @@ config ARCH_MSM_CORTEXMP
config MSM_KRAIT_WFE_FIXUP
bool
config MSM_RESTART_V2
bool
config ARCH_MSM_CORTEX_A5
bool
select HAVE_HW_BRKPT_RESERVED_RW_ACCESS

View File

@ -20,6 +20,7 @@
#include <asm/mach/arch.h>
#include <mach/socinfo.h>
#include <mach/board.h>
#include <mach/restart.h>
static void __init msm_dt_init_irq(void)
{
@ -74,4 +75,5 @@ DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")
.dt_compat = msm_dt_match,
.reserve = msm_dt_reserve,
.init_very_early = msm_dt_init_very_early,
.restart = msm_restart,
MACHINE_END

View File

@ -47,6 +47,12 @@
#define SCM_IO_DISABLE_PMIC_ARBITER 1
#ifdef CONFIG_MSM_RESTART_V2
#define use_restart_v2() 1
#else
#define use_restart_v2() 0
#endif
static int restart_mode;
void *restart_reason;
@ -177,9 +183,8 @@ static irqreturn_t resout_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
void msm_restart(char mode, const char *cmd)
static void msm_restart_prepare(const char *cmd)
{
#ifdef CONFIG_MSM_DLOAD_MODE
/* This looks like a normal reboot at this point. */
@ -197,8 +202,6 @@ void msm_restart(char mode, const char *cmd)
set_dload_mode(0);
#endif
printk(KERN_NOTICE "Going down for restart now\n");
pm8xxx_reset_pwr_off(1);
if (cmd != NULL) {
@ -214,19 +217,30 @@ void msm_restart(char mode, const char *cmd)
__raw_writel(0x77665501, restart_reason);
}
}
}
__raw_writel(0, msm_tmr0_base + WDT0_EN);
if (!(machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa())) {
mb();
__raw_writel(0, PSHOLD_CTL_SU); /* Actually reset the chip */
mdelay(5000);
pr_notice("PS_HOLD didn't work, falling back to watchdog\n");
}
void msm_restart(char mode, const char *cmd)
{
printk(KERN_NOTICE "Going down for restart now\n");
__raw_writel(1, msm_tmr0_base + WDT0_RST);
__raw_writel(5*0x31F3, msm_tmr0_base + WDT0_BARK_TIME);
__raw_writel(0x31F3, msm_tmr0_base + WDT0_BITE_TIME);
__raw_writel(1, msm_tmr0_base + WDT0_EN);
if (!use_restart_v2()) {
msm_restart_prepare(cmd);
__raw_writel(0, msm_tmr0_base + WDT0_EN);
if (!(machine_is_msm8x60_fusion() ||
machine_is_msm8x60_fusn_ffa())) {
mb();
/* Actually reset the chip */
__raw_writel(0, PSHOLD_CTL_SU);
mdelay(5000);
pr_notice("PS_HOLD didn't work, falling back to watchdog\n");
}
__raw_writel(1, msm_tmr0_base + WDT0_RST);
__raw_writel(5*0x31F3, msm_tmr0_base + WDT0_BARK_TIME);
__raw_writel(0x31F3, msm_tmr0_base + WDT0_BITE_TIME);
__raw_writel(1, msm_tmr0_base + WDT0_EN);
} else
__raw_writel(0, MSM_MPM2_PSHOLD_BASE);
mdelay(10000);
printk(KERN_ERR "Restarting has failed\n");