diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/kernel/process.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 6b4f5748d0be..a11e2aa73cbc 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -26,8 +26,6 @@ | |||
26 | static int hlt_counter; | 26 | static int hlt_counter; |
27 | int ubc_usercnt = 0; | 27 | int ubc_usercnt = 0; |
28 | 28 | ||
29 | #define HARD_IDLE_TIMEOUT (HZ / 3) | ||
30 | |||
31 | void (*pm_idle)(void); | 29 | void (*pm_idle)(void); |
32 | void (*pm_power_off)(void); | 30 | void (*pm_power_off)(void); |
33 | EXPORT_SYMBOL(pm_power_off); | 31 | EXPORT_SYMBOL(pm_power_off); |
@@ -44,16 +42,39 @@ void enable_hlt(void) | |||
44 | } | 42 | } |
45 | EXPORT_SYMBOL(enable_hlt); | 43 | EXPORT_SYMBOL(enable_hlt); |
46 | 44 | ||
45 | static int __init nohlt_setup(char *__unused) | ||
46 | { | ||
47 | hlt_counter = 1; | ||
48 | return 1; | ||
49 | } | ||
50 | __setup("nohlt", nohlt_setup); | ||
51 | |||
52 | static int __init hlt_setup(char *__unused) | ||
53 | { | ||
54 | hlt_counter = 0; | ||
55 | return 1; | ||
56 | } | ||
57 | __setup("hlt", hlt_setup); | ||
58 | |||
47 | void default_idle(void) | 59 | void default_idle(void) |
48 | { | 60 | { |
49 | if (!hlt_counter) | 61 | if (!hlt_counter) { |
50 | cpu_sleep(); | 62 | clear_thread_flag(TIF_POLLING_NRFLAG); |
51 | else | 63 | smp_mb__after_clear_bit(); |
52 | cpu_relax(); | 64 | set_bl_bit(); |
65 | while (!need_resched()) | ||
66 | cpu_sleep(); | ||
67 | clear_bl_bit(); | ||
68 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
69 | } else | ||
70 | while (!need_resched()) | ||
71 | cpu_relax(); | ||
53 | } | 72 | } |
54 | 73 | ||
55 | void cpu_idle(void) | 74 | void cpu_idle(void) |
56 | { | 75 | { |
76 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
77 | |||
57 | /* endless idle loop with no priority at all */ | 78 | /* endless idle loop with no priority at all */ |
58 | while (1) { | 79 | while (1) { |
59 | void (*idle)(void) = pm_idle; | 80 | void (*idle)(void) = pm_idle; |