1 /* 2 * The idle loop for all SuperH platforms. 3 * 4 * Copyright (C) 2002 - 2009 Paul Mundt 5 * 6 * This file is subject to the terms and conditions of the GNU General Public 7 * License. See the file "COPYING" in the main directory of this archive 8 * for more details. 9 */ 10 #include <linux/module.h> 11 #include <linux/init.h> 12 #include <linux/mm.h> 13 #include <linux/pm.h> 14 #include <linux/tick.h> 15 #include <linux/preempt.h> 16 #include <linux/thread_info.h> 17 #include <linux/irqflags.h> 18 #include <linux/smp.h> 19 #include <linux/cpuidle.h> 20 #include <linux/atomic.h> 21 #include <asm/pgalloc.h> 22 #include <asm/smp.h> 23 #include <asm/bl_bit.h> 24 25 static void (*sh_idle)(void); 26 27 void default_idle(void) 28 { 29 set_bl_bit(); 30 local_irq_enable(); 31 /* Isn't this racy ? */ 32 cpu_sleep(); 33 clear_bl_bit(); 34 } 35 36 void arch_cpu_idle_dead(void) 37 { 38 play_dead(); 39 } 40 41 void arch_cpu_idle(void) 42 { 43 if (cpuidle_idle_call()) 44 sh_idle(); 45 } 46 47 void __init select_idle_routine(void) 48 { 49 /* 50 * If a platform has set its own idle routine, leave it alone. 51 */ 52 if (!sh_idle) 53 sh_idle = default_idle; 54 } 55 56 void stop_this_cpu(void *unused) 57 { 58 local_irq_disable(); 59 set_cpu_online(smp_processor_id(), false); 60 61 for (;;) 62 cpu_sleep(); 63 } 64