1 /* 2 * Copyright (C) STMicroelectronics 2009 3 * Copyright (C) ST-Ericsson SA 2010 4 * 5 * License Terms: GNU General Public License v2 6 * Based on ARM realview platform 7 * 8 * Author: Sundar Iyer <sundar.iyer@stericsson.com> 9 * 10 */ 11 #include <linux/kernel.h> 12 #include <linux/errno.h> 13 #include <linux/smp.h> 14 15 #include <asm/cacheflush.h> 16 #include <asm/smp_plat.h> 17 18 extern volatile int pen_release; 19 platform_do_lowpower(unsigned int cpu)20static inline void platform_do_lowpower(unsigned int cpu) 21 { 22 flush_cache_all(); 23 24 /* we put the platform to just WFI */ 25 for (;;) { 26 __asm__ __volatile__("dsb\n\t" "wfi\n\t" 27 : : : "memory"); 28 if (pen_release == cpu_logical_map(cpu)) { 29 /* 30 * OK, proper wakeup, we're done 31 */ 32 break; 33 } 34 } 35 } 36 platform_cpu_kill(unsigned int cpu)37int platform_cpu_kill(unsigned int cpu) 38 { 39 return 1; 40 } 41 42 /* 43 * platform-specific code to shutdown a CPU 44 * 45 * Called with IRQs disabled 46 */ platform_cpu_die(unsigned int cpu)47void platform_cpu_die(unsigned int cpu) 48 { 49 /* directly enter low power state, skipping secure registers */ 50 platform_do_lowpower(cpu); 51 } 52 platform_cpu_disable(unsigned int cpu)53int platform_cpu_disable(unsigned int cpu) 54 { 55 /* 56 * we don't allow CPU 0 to be shutdown (it is still too special 57 * e.g. clock tick interrupts) 58 */ 59 return cpu == 0 ? -EPERM : 0; 60 } 61