Paul Mundt | 1da1180 | 2008-11-26 15:52:44 +0900 | [diff] [blame] | 1 | /* |
2 | * The idle loop for all SuperH platforms. | ||||
3 | * | ||||
Paul Mundt | 2e046b9 | 2009-06-19 14:40:51 +0900 | [diff] [blame] | 4 | * Copyright (C) 2002 - 2009 Paul Mundt |
Paul Mundt | 1da1180 | 2008-11-26 15:52:44 +0900 | [diff] [blame] | 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> | ||||
Paul Mundt | 2e046b9 | 2009-06-19 14:40:51 +0900 | [diff] [blame] | 18 | #include <linux/smp.h> |
Arun Sharma | 60063497 | 2011-07-26 16:09:06 -0700 | [diff] [blame] | 19 | #include <linux/atomic.h> |
Paul Mundt | f03c486 | 2012-03-30 19:29:57 +0900 | [diff] [blame] | 20 | #include <asm/pgalloc.h> |
Paul Mundt | 763142d | 2010-04-26 19:08:55 +0900 | [diff] [blame] | 21 | #include <asm/smp.h> |
David Howells | e839ca5 | 2012-03-28 18:30:03 +0100 | [diff] [blame] | 22 | #include <asm/bl_bit.h> |
Paul Mundt | 1da1180 | 2008-11-26 15:52:44 +0900 | [diff] [blame] | 23 | |
Len Brown | 3738fa5 | 2013-02-09 22:52:57 -0500 | [diff] [blame] | 24 | static void (*sh_idle)(void); |
Paul Mundt | fbb82b0 | 2010-01-20 16:42:52 +0900 | [diff] [blame] | 25 | |
Paul Mundt | f533c3d | 2009-10-16 17:20:58 +0900 | [diff] [blame] | 26 | void default_idle(void) |
27 | { | ||||
Thomas Gleixner | dc775dd | 2013-03-21 22:49:59 +0100 | [diff] [blame] | 28 | set_bl_bit(); |
29 | local_irq_enable(); | ||||
30 | /* Isn't this racy ? */ | ||||
31 | cpu_sleep(); | ||||
32 | clear_bl_bit(); | ||||
Paul Mundt | f533c3d | 2009-10-16 17:20:58 +0900 | [diff] [blame] | 33 | } |
34 | |||||
Thomas Gleixner | dc775dd | 2013-03-21 22:49:59 +0100 | [diff] [blame] | 35 | void arch_cpu_idle_dead(void) |
Paul Mundt | 1da1180 | 2008-11-26 15:52:44 +0900 | [diff] [blame] | 36 | { |
Thomas Gleixner | dc775dd | 2013-03-21 22:49:59 +0100 | [diff] [blame] | 37 | play_dead(); |
38 | } | ||||
Paul Mundt | f533c3d | 2009-10-16 17:20:58 +0900 | [diff] [blame] | 39 | |
Thomas Gleixner | dc775dd | 2013-03-21 22:49:59 +0100 | [diff] [blame] | 40 | void arch_cpu_idle(void) |
41 | { | ||||
Nicolas Pitre | f0c5cdb | 2014-01-29 12:45:11 -0500 | [diff] [blame] | 42 | sh_idle(); |
Paul Mundt | 1da1180 | 2008-11-26 15:52:44 +0900 | [diff] [blame] | 43 | } |
Paul Mundt | 2e046b9 | 2009-06-19 14:40:51 +0900 | [diff] [blame] | 44 | |
Paul Mundt | 90851c4 | 2010-03-23 17:06:47 +0900 | [diff] [blame] | 45 | void __init select_idle_routine(void) |
Paul Mundt | f533c3d | 2009-10-16 17:20:58 +0900 | [diff] [blame] | 46 | { |
47 | /* | ||||
48 | * If a platform has set its own idle routine, leave it alone. | ||||
49 | */ | ||||
Thomas Gleixner | dc775dd | 2013-03-21 22:49:59 +0100 | [diff] [blame] | 50 | if (!sh_idle) |
Len Brown | 3738fa5 | 2013-02-09 22:52:57 -0500 | [diff] [blame] | 51 | sh_idle = default_idle; |
Paul Mundt | f533c3d | 2009-10-16 17:20:58 +0900 | [diff] [blame] | 52 | } |
53 | |||||
Paul Mundt | fbb82b0 | 2010-01-20 16:42:52 +0900 | [diff] [blame] | 54 | void stop_this_cpu(void *unused) |
55 | { | ||||
56 | local_irq_disable(); | ||||
Paul Mundt | f0ccf27 | 2010-04-26 18:39:50 +0900 | [diff] [blame] | 57 | set_cpu_online(smp_processor_id(), false); |
Paul Mundt | fbb82b0 | 2010-01-20 16:42:52 +0900 | [diff] [blame] | 58 | |
59 | for (;;) | ||||
60 | cpu_sleep(); | ||||
61 | } |