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/atomic.h> 20#include <asm/pgalloc.h> 21#include <asm/smp.h> 22#include <asm/bl_bit.h> 23 24static void (*sh_idle)(void); 25 26void default_idle(void) 27{ 28 set_bl_bit(); 29 local_irq_enable(); 30 /* Isn't this racy ? */ 31 cpu_sleep(); 32 clear_bl_bit(); 33} 34 35void arch_cpu_idle_dead(void) 36{ 37 play_dead(); 38} 39 40void arch_cpu_idle(void) 41{ 42 sh_idle(); 43} 44 45void __init select_idle_routine(void) 46{ 47 /* 48 * If a platform has set its own idle routine, leave it alone. 49 */ 50 if (!sh_idle) 51 sh_idle = default_idle; 52} 53 54void stop_this_cpu(void *unused) 55{ 56 local_irq_disable(); 57 set_cpu_online(smp_processor_id(), false); 58 59 for (;;) 60 cpu_sleep(); 61} 62