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