2010-08-02 14:18:19 +04:00
/*
* OMAP4 SMP cpu - hotplug support
*
* Copyright ( C ) 2010 Texas Instruments , Inc .
* Author :
* Santosh Shilimkar < santosh . shilimkar @ ti . com >
*
* Platform file needed for the OMAP4 SMP . This file is based on arm
* realview smp platform .
* Copyright ( c ) 2002 ARM Limited .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/smp.h>
2012-05-09 19:08:35 +04:00
# include <linux/io.h>
2010-08-02 14:18:19 +04:00
2012-09-20 22:41:16 +04:00
# include "omap-wakeupgen.h"
2011-11-11 01:45:17 +04:00
# include "common.h"
2010-06-16 20:49:48 +04:00
# include "powerdomain.h"
2010-08-02 14:18:19 +04:00
/*
* platform - specific code to shutdown a CPU
* Called with IRQs disabled
*/
2011-09-08 16:15:22 +04:00
void __ref omap4_cpu_die ( unsigned int cpu )
2010-08-02 14:18:19 +04:00
{
2012-05-09 19:08:35 +04:00
unsigned int boot_cpu = 0 ;
void __iomem * base = omap_get_wakeupgen_base ( ) ;
2010-06-16 20:49:48 +04:00
2010-08-02 14:18:19 +04:00
/*
* we ' re ready for shutdown now , so do it
*/
2012-05-09 19:08:35 +04:00
if ( omap_secure_apis_support ( ) ) {
if ( omap_modify_auxcoreboot0 ( 0x0 , 0x200 ) ! = 0x0 )
pr_err ( " Secure clear status failed \n " ) ;
} else {
2014-04-15 21:37:46 +04:00
writel_relaxed ( 0 , base + OMAP_AUX_CORE_BOOT_0 ) ;
2012-05-09 19:08:35 +04:00
}
2010-08-02 14:18:19 +04:00
for ( ; ; ) {
/*
2010-06-16 20:49:48 +04:00
* Enter into low power state
2010-08-02 14:18:19 +04:00
*/
2010-06-16 20:49:48 +04:00
omap4_hotplug_cpu ( cpu , PWRDM_POWER_OFF ) ;
2012-05-09 19:08:35 +04:00
if ( omap_secure_apis_support ( ) )
boot_cpu = omap_read_auxcoreboot0 ( ) ;
else
boot_cpu =
2014-04-15 21:37:46 +04:00
readl_relaxed ( base + OMAP_AUX_CORE_BOOT_0 ) > > 5 ;
2012-05-09 19:08:35 +04:00
if ( boot_cpu = = smp_processor_id ( ) ) {
2010-08-02 14:18:19 +04:00
/*
* OK , proper wakeup , we ' re done
*/
break ;
}
pr_debug ( " CPU%u: spurious wakeup call \n " , cpu ) ;
}
}