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:
parent
b85b2931fd
commit
7e3ce5b119
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue