2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2010-08-02 13:18:19 +03: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 .
*/
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/smp.h>
2012-05-09 20:38:35 +05:30
# include <linux/io.h>
2010-08-02 13:18:19 +03:00
2012-09-20 11:41:16 -07:00
# include "omap-wakeupgen.h"
2011-11-10 22:45:17 +01:00
# include "common.h"
2010-06-16 22:19:48 +05:30
# include "powerdomain.h"
2010-08-02 13:18:19 +03:00
/*
* platform - specific code to shutdown a CPU
* Called with IRQs disabled
*/
2015-10-19 13:05:33 -07:00
void omap4_cpu_die ( unsigned int cpu )
2010-08-02 13:18:19 +03:00
{
2012-05-09 20:38:35 +05:30
unsigned int boot_cpu = 0 ;
void __iomem * base = omap_get_wakeupgen_base ( ) ;
2010-06-16 22:19:48 +05:30
2010-08-02 13:18:19 +03:00
/*
* we ' re ready for shutdown now , so do it
*/
2012-05-09 20:38:35 +05:30
if ( omap_secure_apis_support ( ) ) {
if ( omap_modify_auxcoreboot0 ( 0x0 , 0x200 ) ! = 0x0 )
pr_err ( " Secure clear status failed \n " ) ;
} else {
2014-04-15 20:37:46 +03:00
writel_relaxed ( 0 , base + OMAP_AUX_CORE_BOOT_0 ) ;
2012-05-09 20:38:35 +05:30
}
2010-08-02 13:18:19 +03:00
for ( ; ; ) {
/*
2010-06-16 22:19:48 +05:30
* Enter into low power state
2010-08-02 13:18:19 +03:00
*/
2010-06-16 22:19:48 +05:30
omap4_hotplug_cpu ( cpu , PWRDM_POWER_OFF ) ;
2012-05-09 20:38:35 +05:30
if ( omap_secure_apis_support ( ) )
2017-03-22 11:01:48 -07:00
boot_cpu = omap_read_auxcoreboot0 ( ) > > 9 ;
2012-05-09 20:38:35 +05:30
else
boot_cpu =
2014-04-15 20:37:46 +03:00
readl_relaxed ( base + OMAP_AUX_CORE_BOOT_0 ) > > 5 ;
2012-05-09 20:38:35 +05:30
if ( boot_cpu = = smp_processor_id ( ) ) {
2010-08-02 13:18:19 +03:00
/*
* OK , proper wakeup , we ' re done
*/
break ;
}
pr_debug ( " CPU%u: spurious wakeup call \n " , cpu ) ;
}
}
2016-06-22 02:05:12 -07:00
/* Needed by kexec and platform_can_cpu_hotplug() */
int omap4_cpu_kill ( unsigned int cpu )
{
return 1 ;
}