diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/include/mach/omap4-common.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap-smp.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap4-mpuss-lowpower.c | 15 |
3 files changed, 16 insertions, 4 deletions
diff --git a/arch/arm/mach-omap2/include/mach/omap4-common.h b/arch/arm/mach-omap2/include/mach/omap4-common.h index 0489ebe..f37cf4e 100644 --- a/arch/arm/mach-omap2/include/mach/omap4-common.h +++ b/arch/arm/mach-omap2/include/mach/omap4-common.h @@ -25,6 +25,7 @@ /* * Secure HAL, PPA services available */ +#define PPA_SERVICE_0 0x21 #define PPA_SERVICE_PL310_POR 0x23 #define PPA_SERVICE_DEFAULT_POR_NS_SMP 0x25 /* diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 4fbb782..40e425a 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c @@ -45,7 +45,9 @@ void __cpuinit platform_secondary_init(unsigned int cpu) { /* Enable NS access to SMP bit for this CPU on HS devices */ if (cpu_is_omap443x() && (omap_type() != OMAP2_DEVICE_TYPE_GP)) - omap4_secure_dispatcher(PPA_SERVICE_DEFAULT_POR_NS_SMP, 4, 0, 0, 0, 0, 0); + omap4_secure_dispatcher(PPA_SERVICE_DEFAULT_POR_NS_SMP, + FLAG_START_CRITICAL, + 0, 0, 0, 0, 0); /* * If any interrupts are already enabled for the primary diff --git a/arch/arm/mach-omap2/omap4-mpuss-lowpower.c b/arch/arm/mach-omap2/omap4-mpuss-lowpower.c index c4855d9..a635a0a 100644 --- a/arch/arm/mach-omap2/omap4-mpuss-lowpower.c +++ b/arch/arm/mach-omap2/omap4-mpuss-lowpower.c @@ -621,11 +621,20 @@ cpu_prepare: /* Enable GIC distributor and inteface on CPU0*/ gic_cpu_enable(); gic_dist_enable(); + + /* + * Dummy dispatcher call after OSWR and OFF + * Restore the right return Kernel address (with MMU on) for + * subsequent calls to secure ROM. Otherwise the return address + * will be to a PA return address and the system will hang. + */ + if (omap_type() != OMAP2_DEVICE_TYPE_GP) + omap4_secure_dispatcher(PPA_SERVICE_0, + FLAG_START_CRITICAL, + 0, 0, 0, 0, 0); } - if ((omap4_device_prev_state_off()) && - (omap_type() != OMAP2_DEVICE_TYPE_GP)) { - omap4_secure_dispatcher(0x21, 4, 0, 0, 0, 0, 0); + if (omap4_device_prev_state_off()) { restore_ivahd_tesla_regs(); restore_l3instr_regs(); } |