avr32: Use generic idle loop

Also replace the idle poll enforcement by the generic functionality.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Paul McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Cc: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Cc: Magnus Damm <magnus.damm@gmail.com>
Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Link: http://lkml.kernel.org/r/20130321215233.950290809@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Thomas Gleixner 2013-03-21 22:49:40 +01:00
parent 0087298f68
commit 01426478df
5 changed files with 10 additions and 44 deletions

View File

@ -10,6 +10,7 @@ config AVR32
select VIRT_TO_BUS select VIRT_TO_BUS
select GENERIC_IRQ_PROBE select GENERIC_IRQ_PROBE
select GENERIC_ATOMIC64 select GENERIC_ATOMIC64
select GENERIC_IDLE_LOOP
select HARDIRQS_SW_RESEND select HARDIRQS_SW_RESEND
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select ARCH_HAVE_CUSTOM_GPIO_H select ARCH_HAVE_CUSTOM_GPIO_H

View File

@ -30,18 +30,9 @@ EXPORT_SYMBOL(pm_power_off);
* This file handles the architecture-dependent parts of process handling.. * This file handles the architecture-dependent parts of process handling..
*/ */
void cpu_idle(void) void arch_cpu_idle(void)
{ {
/* endless idle loop with no priority at all */ cpu_enter_idle();
while (1) {
tick_nohz_idle_enter();
rcu_idle_enter();
while (!need_resched())
cpu_idle_sleep();
rcu_idle_exit();
tick_nohz_idle_exit();
schedule_preempt_disabled();
}
} }
void machine_halt(void) void machine_halt(void)

View File

@ -12,6 +12,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/cpu.h>
#include <asm/sysreg.h> #include <asm/sysreg.h>
@ -87,13 +88,17 @@ static void comparator_mode(enum clock_event_mode mode,
pr_debug("%s: start\n", evdev->name); pr_debug("%s: start\n", evdev->name);
/* FALLTHROUGH */ /* FALLTHROUGH */
case CLOCK_EVT_MODE_RESUME: case CLOCK_EVT_MODE_RESUME:
cpu_disable_idle_sleep(); /*
* If we're using the COUNT and COMPARE registers we
* need to force idle poll.
*/
cpu_idle_poll_ctrl(true);
break; break;
case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_SHUTDOWN:
sysreg_write(COMPARE, 0); sysreg_write(COMPARE, 0);
pr_debug("%s: stop\n", evdev->name); pr_debug("%s: stop\n", evdev->name);
cpu_enable_idle_sleep(); cpu_idle_poll_ctrl(false);
break; break;
default: default:
BUG(); BUG();

View File

@ -21,30 +21,6 @@
extern void cpu_enter_idle(void); extern void cpu_enter_idle(void);
extern void cpu_enter_standby(unsigned long sdramc_base); extern void cpu_enter_standby(unsigned long sdramc_base);
extern bool disable_idle_sleep;
static inline void cpu_disable_idle_sleep(void)
{
disable_idle_sleep = true;
}
static inline void cpu_enable_idle_sleep(void)
{
disable_idle_sleep = false;
}
static inline void cpu_idle_sleep(void)
{
/*
* If we're using the COUNT and COMPARE registers for
* timekeeping, we can't use the IDLE state.
*/
if (disable_idle_sleep)
cpu_relax();
else
cpu_enter_idle();
}
void intc_set_suspend_handler(unsigned long offset); void intc_set_suspend_handler(unsigned long offset);
#endif #endif

View File

@ -18,13 +18,6 @@
/* Same as 0xfff00000 but fits in a 21 bit signed immediate */ /* Same as 0xfff00000 but fits in a 21 bit signed immediate */
#define PM_BASE -0x100000 #define PM_BASE -0x100000
.section .bss, "wa", @nobits
.global disable_idle_sleep
.type disable_idle_sleep, @object
disable_idle_sleep:
.int 4
.size disable_idle_sleep, . - disable_idle_sleep
/* Keep this close to the irq handlers */ /* Keep this close to the irq handlers */
.section .irq.text, "ax", @progbits .section .irq.text, "ax", @progbits