1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * The idle loop for all SuperH platforms. 4 * 5 * Copyright (C) 2002 - 2009 Paul Mundt 6 */ 7 #include <linux/cpu.h> 8 #include <linux/module.h> 9 #include <linux/init.h> 10 #include <linux/mm.h> 11 #include <linux/pm.h> 12 #include <linux/tick.h> 13 #include <linux/preempt.h> 14 #include <linux/thread_info.h> 15 #include <linux/irqflags.h> 16 #include <linux/smp.h> 17 #include <linux/atomic.h> 18 #include <asm/processor.h> 19 #include <asm/smp.h> 20 #include <asm/bl_bit.h> 21 22 static void (*sh_idle)(void); 23 24 void default_idle(void) 25 { 26 set_bl_bit(); 27 raw_local_irq_enable(); 28 /* Isn't this racy ? */ 29 cpu_sleep(); 30 raw_local_irq_disable(); 31 clear_bl_bit(); 32 } 33 34 void __noreturn arch_cpu_idle_dead(void) 35 { 36 play_dead(); 37 } 38 39 void arch_cpu_idle(void) 40 { 41 sh_idle(); 42 } 43 44 void __init select_idle_routine(void) 45 { 46 /* 47 * If a platform has set its own idle routine, leave it alone. 48 */ 49 if (!sh_idle) 50 sh_idle = default_idle; 51 } 52 53 void stop_this_cpu(void *unused) 54 { 55 local_irq_disable(); 56 set_cpu_online(smp_processor_id(), false); 57 58 for (;;) 59 cpu_sleep(); 60 } 61