2010-12-02 12:11:27 -08:00
/*
* Copyright ( C ) 2002 ARM Ltd .
* All Rights Reserved
*
* 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>
# include <asm/cacheflush.h>
2012-01-20 12:01:12 +01:00
# include <asm/smp_plat.h>
2010-12-02 12:11:27 -08:00
2012-09-12 16:01:40 -07:00
# include "common.h"
2011-09-08 13:15:22 +01:00
2010-12-02 12:11:27 -08:00
static inline void cpu_enter_lowpower ( void )
{
/* Just flush the cache. Changing the coherency is not yet
* available on msm . */
flush_cache_all ( ) ;
}
static inline void cpu_leave_lowpower ( void )
{
}
static inline void platform_do_lowpower ( unsigned int cpu )
{
/* Just enter wfi for now. TODO: Properly shut off the cpu. */
for ( ; ; ) {
/*
* here ' s the WFI
*/
asm ( " wfi "
:
:
: " memory " , " cc " ) ;
2011-08-09 12:02:27 +01:00
if ( pen_release = = cpu_logical_map ( cpu ) ) {
2010-12-02 12:11:27 -08:00
/*
* OK , proper wakeup , we ' re done
*/
break ;
}
/*
* getting here , means that we have come out of WFI without
* having been woken up - this shouldn ' t happen
*
* The trouble is , letting people know about this is not really
* possible , since we are currently running incoherently , and
* therefore cannot safely call printk ( ) or anything else
*/
pr_debug ( " CPU%u: spurious wakeup call \n " , cpu ) ;
}
}
/*
* platform - specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
2011-09-08 13:15:22 +01:00
void __ref msm_cpu_die ( unsigned int cpu )
2010-12-02 12:11:27 -08:00
{
/*
* we ' re ready for shutdown now , so do it
*/
cpu_enter_lowpower ( ) ;
platform_do_lowpower ( cpu ) ;
/*
* bring this CPU back into the world of cache
* coherency , and then restore interrupts
*/
cpu_leave_lowpower ( ) ;
}